요약 (S1 correctness)
doc.schema.at / doc.schema.accepts / doc.schema.kind / doc.schema.describe 의 pointer traversal(schemaAtPointer)이 wrapper(optional/nullable/default/readonly/pipe/lazy 등)를 벗기지 않아, wrapping 된 object/array 컨테이너를 지나는 모든 경로가 slot 이 실재해도 path_not_found 를 반환한다.
재현
const schema = z.object({
user: z.object({ name: z.string() }).optional(),
items: z.array(z.string()).optional(),
req: z.object({ v: z.number() }),
});
const doc = createJSONDocument(schema, { user: { name: "a" }, items: ["x"], req: { v: 1 } });
doc.schema.at("/user/name") // → path_not_found ❌ (slot 실재)
doc.schema.accepts("/items/0", "y") // → path_not_found ❌
doc.schema.at("/req/v") // → ok (required 만 통과)
foundation-gate 가 명시한 form / table adapter 압력을 직접 깨뜨린다 (optional 필드는 폼에서 보편적).
원인
src/domain/schema/inspection/introspection.ts schemaAtPointerUncached 가 각 세그먼트에서 getArrayElement / getObjectShape / record valueType 만 시도하는데, current 가 wrapper 면 이 셋이 모두 null 이다 (inner 는 def.innerType / def.out / def.getter 에 있음). 같은 패키지의 schemaOutputIsKnownJson(model/schema.ts)은 이 wrapper 들을 이미 벗기는데 pointer traversal 만 벗기지 않는 내부 불일치.
수정 방향
traversal 각 세그먼트로 내려가기 전에 current 를 structural schema 로 unwrap. wrapper→inner 매핑은 model/schema.ts 와 동일하게 맞춘다 (optional/nullable/nonoptional/prefault/default/catch/readonly→innerType, pipe→out, lazy→getter).
요약 (S1 correctness)
doc.schema.at/doc.schema.accepts/doc.schema.kind/doc.schema.describe의 pointer traversal(schemaAtPointer)이 wrapper(optional/nullable/default/readonly/pipe/lazy등)를 벗기지 않아, wrapping 된 object/array 컨테이너를 지나는 모든 경로가 slot 이 실재해도path_not_found를 반환한다.재현
foundation-gate 가 명시한 form / table adapter 압력을 직접 깨뜨린다 (optional 필드는 폼에서 보편적).
원인
src/domain/schema/inspection/introspection.tsschemaAtPointerUncached가 각 세그먼트에서getArrayElement/getObjectShape/ recordvalueType만 시도하는데,current가 wrapper 면 이 셋이 모두null이다 (inner 는def.innerType/def.out/def.getter에 있음). 같은 패키지의schemaOutputIsKnownJson(model/schema.ts)은 이 wrapper 들을 이미 벗기는데 pointer traversal 만 벗기지 않는 내부 불일치.수정 방향
traversal 각 세그먼트로 내려가기 전에
current를 structural schema 로 unwrap. wrapper→inner 매핑은model/schema.ts와 동일하게 맞춘다 (optional/nullable/nonoptional/prefault/default/catch/readonly→innerType, pipe→out, lazy→getter).