Skip to content

feat(laws): reach agency adjudications — committee decisions and 행정심판 재결 (WI-P7)#101

Merged
tjdwls101010 merged 1 commit into
mainfrom
wi-p7-committee-decisions
Jul 19, 2026
Merged

feat(laws): reach agency adjudications — committee decisions and 행정심판 재결 (WI-P7)#101
tjdwls101010 merged 1 commit into
mainfrom
wi-p7-committee-decisions

Conversation

@tjdwls101010

Copy link
Copy Markdown
Owner

Why

The oversight question this package could not answer was "did the supervising body actually act?"

The statute was reachable. The court ruling was reachable. The disposition in between was not — a 개인정보보호위원회 의결, a 공정위 과징금 처분, a 조세심판원 재결. The audit doc listed all of them as optional, gated on demand being proven; a harness whose purpose is asking whether a regulator did its job is that proof.

What

Seventeen bodies, one code path. Twelve committees (ppc ftc fsc sfc kcc nhrck acr nlrc eiac iaciac oclt ecc), the general 행정심판 docket (decc), and four special tribunals (acr adap tt kmst). The request shape is identical everywhere; only the vocabulary differs, and that's normalization's job rather than seventeen near-copies of one method.

search-committee-decisions [query] --committee <code>   → committee_decision_hit_list
get-committee-decision --id <id> --committee <code>     → committee_decision_text
search-administrative-appeals [query] [--tribunal]      → administrative_appeal_hit_list
get-administrative-appeal --id <id> [--tribunal]        → administrative_appeal_text

All seventeen probed live on 2026-07-19 with the shared default OC — every one answers list and detail, no 활용신청 needed (this was the plan's blocking pre-check).

Authority is a field, not decoration

A 위원회 결정 is an administrative disposition by the regulator itself. An 행정심판 재결 reviews another agency's disposition and can itself be overturned in court. Neither is precedent.

They get separate kinds and separate authority sentences. Sharing one is how a reviewable disposition ends up cited as a settled one.

The zero-hit discipline matters most here

This family gets used to ask whether a regulator failed to act, so reading 0건 as "never disposed of anything" is wrong in exactly that direction — 비공개, 미접수, and wrong-docket all return zero. The signal says so, and points at the special tribunals, whose 소청·조세·해양안전 cases are absent from the general decc list.

Four normalization traps, all found by probing rather than reading

trap consequence if missed
Special tribunals answer acrSpecialDecc with rows keyed decc matching on the requested target returns nothing → reads as "no records"
Several targets return the literal string "null" for absent fields renders as a plausible case number in an answer
Committees write dates as 2020.6.8. (unpadded, trailing dot) compact_date passes it through; sorts wrong — and in oversight the date is the finding
Field values arrive as string / array / single-key object per body str() yields a Python repr that travels as the agency's wording

Also

--brief now resets each field to its own declared default rather than a blanket "". text: str and full_text: str | None mean different things by absence, and blanking a nullable field to "" turns "not loaded" into "loaded and empty" — a claim about the document rather than about the request. --brief also drops reasoning, the bulk of an adjudication.

Verification

Live: ppc search+load (id 9745), ftc search+load (id 17363), decc search+load (id 273321), 조세심판원 special docket. 511 deterministic tests pass (25 new).

🤖 Generated with Claude Code

The oversight question the package could not answer was "did the supervising
body actually act?" The statute was reachable and the court ruling was
reachable, but the disposition in between was outside the surface entirely:
a 개인정보보호위원회 의결, a 공정위 과징금 처분, a 조세심판원 재결. The
audit doc had them all listed as optional, gated on demand being proven —
and a harness whose whole purpose is asking whether a regulator did its job
is that proof.

Seventeen bodies, one code path: twelve committees (ppc ftc fsc sfc kcc
nhrck acr nlrc eiac iaciac oclt ecc), the general 행정심판 docket, and four
special tribunals. The request shape is identical everywhere; only the
vocabulary differs, and that is normalization's job rather than seventeen
near-copies of one method. All seventeen were probed live on 2026-07-19 with
the shared default OC — every one answers list and detail, no 활용신청
needed.

Authority is a field, not decoration. A 위원회 결정 is an administrative
disposition by the regulator itself; an 행정심판 재결 reviews another
agency's disposition and can itself be overturned in court. Neither is
precedent. They get separate kinds (committee_decision_text vs
administrative_appeal_text) and separate authority sentences, because
sharing one is how a reviewable disposition ends up cited as a settled one.

The zero-hit discipline matters more here than anywhere else in the package.
This family gets used to ask whether a regulator failed to act, and reading
0건 as "never disposed of anything" is wrong in exactly that direction —
비공개, 미접수, and wrong-docket all return zero. The signal says so, and
points at the special tribunals, whose 소청·조세·해양안전 cases are absent
from the general decc list.

Four normalization traps, all found by probing rather than by reading:

- The special tribunals answer a request for `acrSpecialDecc` with rows
  keyed `decc`, so matching on the requested target returns nothing and
  reads as "this tribunal has no records". Rows are found by shape instead.
- Several targets return the literal string "null" for absent fields, which
  renders as a plausible case number in an answer.
- Committees write dates as `2020.6.8.` — unpadded, trailing dot — which the
  shared compact_date passes through untouched. In an oversight question the
  date is the finding, so it is normalized here.
- Field values arrive as bare strings, arrays, or single-key objects for the
  same concept depending on the body; `str()` on those yields a repr.

Also fixes brief mode to reset each field to its own declared default rather
than a blanket "": `text: str` and `full_text: str | None` mean different
things by absence, and blanking a nullable field to "" turns "not loaded"
into "loaded and empty" — a claim about the document rather than about the
request. --brief now also drops `reasoning`, the bulk of an adjudication.

Verified live: ppc search+load (id 9745), ftc search+load (id 17363), decc
search+load (id 273321), and the 조세심판원 special docket.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@tjdwls101010
tjdwls101010 merged commit 324cb13 into main Jul 19, 2026
5 checks passed
@tjdwls101010
tjdwls101010 deleted the wi-p7-committee-decisions branch July 19, 2026 14:06
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.

1 participant