Files
stack/docs/plans/reviews/2026-09-06_foundation-inspector-filbert-verdict.md
jason.woltje 8ebddd6f93 feat(foundation): offline synthetic scope/permission inspector (FI-FILBERT-8 APPROVED r6)
Rocko-authored, Filbert-reviewed inspector (r6 manifest
a4a44930...) with full review/build/verdict evidence under
docs/plans/reviews. 43/0 selftests, oracle zero-disagreement,
foundation checker PASS. Owner A9 acceptance recorded separately.
2026-09-07 14:06:35 -05:00

14 KiB
Raw Permalink Blame History

FI-FILBERT-2 — independent frozen-charter review

Reviewer: filbert. Author/integrator: darkwing. Contributor: rocko. Follow-up owner: darkwing. Date: 2026-09-06.

Admission and verdict

NOT APPROVED for implementation-charter readiness. The bounded inspector is plausibly implementable without a new dependency or live runtime, but the frozen algorithm needs the three substantive clarifications below before code authorization. This is a written specification verdict, not a reproduced implementation failure.

Admission remains compatible: no competing current personal owner-authorized assignment appeared. I did not author/co-author either input. I treated Rocko's note as contributor material, not his approval of darkwing's integration. Charter corrections take precedence over incorporated note sections 513.

Exact inputs independently hashed:

  • docs/plans/2026-09-06_foundation-inspector-charter.md, candidate 2: cbd0487a2ab699722924e2f91367bf556facb015752ce3b5a76ad474977df791
  • docs/plans/reviews/2026-09-06_foundation-inspector-rocko-feasibility-r2.md: f2f47fcfe22dca79f10f885b83d87a2f846fdb560425a4e20705c40ce4a123e1
  • Accepted map: 7345f330fc6bfae5aa1d896c78cfb7cbe62efbae.
  • Source/plan baseline: d4696d09eb1b5dcf1028f30db2cd63735f51cb16.

The first two are frozen uncommitted files, not blobs falsely attributed to the source baseline. Source comparisons used git show at the specified commits.

Numbered findings

1. Blocking / high — consulted registration delegation has no semantic gate

Locations: charter §§34, especially current registration/delegation references and adoption of L1L9; incorporated r2 §§6.26.3 and §7 L2/L3. Baseline candidate README:7378,128136; records.schema.json $defs/registrationPayload and $defs/decisionPayload.

The registration's delegationRef may be non-null. The specified rules require that it resolve, name a head, and have the record kind decision. L2/L3 then check registration status, role ceiling and narrowing. They do not say that the referenced decision must be an approved, applicable delegation, or what a rejected/revoked or unrelated decision does to the registration's simulated admission.

Concrete witness to specify: an otherwise valid active registration points to a current rejected delegation decision, or to a current plan-approval/acceptance about unrelated work. All its role/policy layers permit file.read. Exact reference resolution and active registration status alone do not reject these cases under the listed algorithm. They must not silently become a permitted preview of current authority. Charter §5's proposal delegation checks do not cover ordinary L2/L3 registration use.

Independent evidence: a baseline valid registration mutated to reference the valid fixture's non-delegation decision remains JSON-Schema-valid. This was an isolated shape probe, not an executed inspector or complete graph demonstration. It establishes that the schema cannot supply the missing semantic check.

Required correction: define the simulation semantics of non-null registration delegation references, including applicable kind/outcome/recipient/scope bounds and revocation/current-decision behavior. Keep null/owner-origin registration assumptions explicit. Add coherent positive and rejected/unrelated/current-revoked negatives that reach that semantic gate. No actual authentication or signature verification is requested for this offline slice.

2. Blocking / high — cross-scope work-reference admission is underspecified

Locations: charter §3:8895 and §4; incorporated r2 §6.2:222227 and §7 L8. Accepted map:250269; baseline candidate README:5771.

The baseline requires task mission/dependency references to resolve to permitted work, with cross-scope access distinct from membership and execution authority. The incorporated graph rule only says a task's mission resolves in the “selected project.” The charter adds accepted status for same-project dependencies before file.change, but does not define access checks for work in another workspace of that project. “Dependencies grant no ownership/access” is not an algorithm for checking whether the referenced work is permitted.

Concrete witnesses:

  • Agent A is registered only in W1. Its selected W1 task names an active mission, or an accepted dependency task, in W2 of the same project. All named records and declarations exist. The listed same-project/status checks can succeed without any check of A's permission to use that W2 work reference.
  • An unselected historical/current task in P2 has a legitimate P2 mission while selection names P1. If “selected project” is a global structural graph constraint, this legitimate separate project is rejected. If it means each task's owning project/context, the specification should say so. This matters to a bundle with multiple projects and the new original/target requester contexts.
  • A dependency in another project is said not to lend permission and broader execution semantics are unsupported, but the exact admission result for that reference is not stated. It must not simply be omitted from readiness checks.

Independent evidence: a valid baseline task mutated to name a mission in a different workspace of the same project remains JSON-Schema-valid. No cross-scope permission resolver was run or claimed; this is a missing specified semantic rule.

Required correction: distinguish per-record structural ownership from per-caller consulted-reference access. Define the supported mission/dependency scope relations, visibility/admission checks, and refusal for out-of-slice references, with exact rule/exit outcomes. Add coherent same-project-unregistered-workspace and unrelated-P2 inventory tests. Resolve this within the bounded model, not by implementing real authentication or expanding into a runtime dependency engine.

3. Blocking / medium — delegation-chain refusal lacks an observable predicate

Locations: charter §3 declaration limits and §5:133135; incorporated r2 §§5.2,6.2,8; baseline decisionPayload and artifactRef definitions.

The charter promises “Unmodelled delegation chains refuse unsupported-capability.” The closed proposal supplies one delegationRef. A decision has subjectRefs and an artifact basis, but no typed parent-delegation field. Declared artifacts contain only runId/artifactId/digest; the inspector never reads their bodies. The specification does not define a subjectRef to another decision as a delegation-parent relation (subject references otherwise explicitly support history).

Consequently an implementation cannot determine that an otherwise well-shaped delegation relies on a chain hidden behind its declared basis. Adding an arbitrary parent field would instead fail the unknown-field structural rule, not reach the promised unsupported-capability gate. Treating every referenced decision as a parent would invent a relation and can misclassify historical subjects.

Required correction: state exactly what observable input denotes an unsupported chain and its precedence, or explicitly delimit the model to direct declared delegation assumptions and withdraw any claim to detect hidden chains. Define tests for the chosen supported/unsupported distinction. Do not infer trust from artifact presence or add an undocumented parent relationship during coding.

4. Nonblocking / medium — cycle fixtures need explicit within-graph precedence

Locations: charter §3:8890 and A3; incorporated r2 §§6.26.3,12.3,13.

The global stages are ordered, but ownership/parent-scope/continuity checks versus cycle checks within the graph stage are not. A mission cycle necessarily violates the permitted workspace-to-project parent structure; a supersedes cycle necessarily violates the immediately preceding revision rule. Either can therefore be caught by another semantic guard before the cycle detector.

Independent evidence: a workspace mission with a self-parent and a revision-2 task with self-supersedes both pass the record schema. Thus cycle tests can reach a semantic detector if it precedes the other graph guards; they are not inherently impossible. After successful parent-scope/continuity checks, those cycle cases cannot reach a distinct cycle outcome.

Disposition / requested clarification: freeze the graph sub-order or document which guard is the intended outcome for each fixture. Use separate detector-unit and CLI-precedence tests where appropriate. Do not count an earlier wrong-owner or bad-predecessor refusal as demonstrated cycle-detector coverage. This does not by itself require a larger implementation scope.

5. Nonblocking / low — strengthen differential coverage beyond the listed mutations

Locations: charter §8; incorporated r2 §12.1; pinned checker/schema.

The mandatory independent Python oracle, pinned hashes, no-skip rule, and separation of schema verdict from inspector-profile/unsupported-kind/graph verdict are valuable and address drift. The listed mutations do not systematically cover scalar type substitution, all null/absence branches, numeric bounds/boolean-versus-integer cases, object-order-insensitive uniqueness, or non-BMP character-count boundaries.

Disposition / recommendation: include those boundaries in the deterministic corpus, particularly because the Node validator is handwritten. Numeric 1.0 is a valid schema integer but forbidden as an inspector input token; retain separate entry paths for those tests. A passing finite corpus is compatibility evidence, not proof that all candidate-schema behavior has been implemented.

Review-question dispositions

Question Disposition
Coherent, implementable, faithful, ready for code authorization? Not yet: findings 13 require design resolution. The dependency-free offline architecture itself is feasible in principle.
Exact types, subset, history, mandatory/optional layers Reference types, eight-kind subset, explicit execution layer and null narrowing are sound. Complete-history versus consulted-head distinction is materially improved. Registration delegation and cross-scope reference semantics remain incomplete.
Requester contexts and reassignment Both requester contexts correctly apply all L1L9 rather than just memberships. Subject/selection binding, approved task intent and no reassignment success are clear. Delegation-chain behavior needs finding 3 resolved. No mock basis/auth ID is treated here as authentic evidence.
Privacy, output, exits, number/Unicode domains Revised closed output removes inventory/count disclosure; null pre-validation fields, fixed prose, JSON disclaimer field and escaped text are sensible. Numeric lexical profile is distinct from schema semantics. Clarify cycle precedence per finding 4 and test those output rules rather than just exit codes.
Filesystem and no-effect limits Proposed descriptor-based Linux boundary is implementable; final-component symlink protection is not parent containment. O_CLOEXEC correction, quiescent-input limitation and no proof-of-no-reads caveats are honest. No descriptor behavior was tested in this review.
Differential verification and fixture reachability Mandatory oracle/hashes and separated validation layers are sound. Findings 45 qualify reachability and coverage. Existing fixtures are shapes, not a coherent permission graph.
Small first slice / gates Still offline and bounded, but already includes a full historical graph and substantial handwritten validation. Resolve the above rather than having the coder invent semantics. Written approval, implementation authority, code review and Jason's demo remain separate gates.

Independently measured receipts and limits

  1. sha256sum of both frozen files matched the exact requested hashes.
  2. git show d4696d09:<candidate path> read schema/fixtures/checker. Independent SHA-256 matched records.schema.json 05774aaf6943cb69c113e39ff1c29676a2a230ca7bf665c50dbcaa8049672af6 and check.py 82564a7d3200afcdda0850a9454cac6e6cd6a76687d2162c13cf214d7eac4607. Temporary copies: /tmp/fi-filbert-2.XdSfM8/.
  3. Inline Python using existing jsonschema 4.26.0 ran five schema-shape probes from copied committed fixtures: cross-workspace mission reference; mission self-cycle; revision-2 self-supersedes; registration pointing to non-delegation decision; numeric revision 1.0. All five schema-valid, assertions passed, exit 0. These deliberately show where separate semantics/profile checks are required. Custom calendar/path format callbacks were not exercised by these probes; their existing fixture dates/paths were unchanged. No complete bundle or inspector execution is claimed.
  4. Inline Python json.dumps(sort_keys=True,separators=(',',':')) plus SHA-256 independently recomputed V1V3: all matched, exit 0:
    • V1 0bc44e14fd8354a8a85be879306a54881da7a0cb4d3dcf1f88bc4bc08a40dc9c
    • V2 63817bffc57803ca6ac5df971aa0a160d4be73646394b3bc536578bd66c82660
    • V3 d538c865808cfe7665956615fb48f69819baa0833626d1ef6e1cb3614acbc7da
  5. node -e read Node constants and parsed synthetic numeric strings. Observed Node v26.8.1, O_RDONLY=0, O_NOFOLLOW=131072, O_NONBLOCK=2048, O_CLOEXEC absent. 1.0 parses as 1, -0 preserves negative zero, and 9007199254740993 rounds to 9007199254740992. This supports exact lexical checking before Number conversion. O_RDONLY availability must not be tested by truthiness because its valid value is zero. No file-open/symlink/FIFO behavior was measured; constants alone are not enforcement evidence.

No proposed code exists to test. I did not run the proposed differential bridge, CLI, non-effect harness, five repository suites or foundation author checker in this FI-FILBERT-2 cycle. Earlier FM-FILBERT-1 receipts are not relabelled as new execution. No dependencies, native/sync tests, engines, live runtime, credentials, installations, commits, pushes, source changes or ~/.mosaic investigation occurred. Only this offered verdict path was written in the repository. No charter fix or co-authorship was performed. Follow-up and any revised candidate remain darkwing's; this verdict authorizes no implementation or phase advancement.