Commit 688fe97
jgstern-agent
fix(io-boundaries): distinguish "no I/O" from "language unsupported" (INV-javam)
UAT-2026-04-13 DQ-03 + DQ-04 flagged the silent-failure class:
`hypergumbo io-boundaries` on a codebase containing a language
with no I/O primitive catalog returned zero boundaries with no
warning. Output identical to a genuinely I/O-free codebase, and
downstream taint-flow trivially passed every claim (false
security confidence).
Even as organic catalog expansion lands (WI-banaf TypeScript,
WI-vibur Elixir, WI-sakan Java, WI-rujos Kotlin), the invariant
has to hold independently: hypergumbo will always have some
language with no catalog, and "zero" must never silently mean
"we didn't look."
The fix is narrow:
1. IoBoundaryCatalog gains an `is_supported: bool` field. Default
True. `load_catalog()` sets it to False when no YAML file
(and no alias / parent) resolves.
2. New `io_boundary.is_language_supported(lang)` helper exposes
the flag to callers without materializing the full catalog.
3. `cmd_io_boundaries` tracks unsupported languages separately
from supported-but-zero-matches languages and:
- Prints a stderr notice ("no I/O primitive catalog for
language(s): X, Y. Zero boundaries reported for these
languages does NOT mean the code is I/O-free — INV-javam")
so humans aren't misled.
- Adds `unsupported_languages: [...]` to the JSON output
(stable schema — always present, empty list when every
detected language is supported) so programmatic consumers
like taint-flow can refuse to assert success on unsupported
code.
Taint-flow consumption of this signal is deferred to a sibling
PR. The current change delivers the io-boundaries side, which is
what every downstream checker needs anyway.
9 new tests:
- Catalog-level: nonexistent language returns is_supported=False,
supported languages return True, aliased languages (typescript,
cpp) inherit True from their alias target, parent-inherited
languages (scala, kotlin, elixir) return True, and the
module-level helper mirrors the flag.
- cmd-level: the stderr notice fires for a brainfuck-language
node, does NOT fire on a python-only codebase, the JSON output
surfaces `unsupported_languages: ["brainfuck", "nim"]`, and
emits `unsupported_languages: []` when every language is
supported (stable schema guard).
Tracker: moved INV-javam from `violated` to `pending_validation`
— bakeoff will confirm the notice fires on real unsupported
repos (TypeScript/Nim/Solidity/Elixir) and doesn't on
fully-supported ones.
Signed-off-by: jgstern-agent <josh-agent@iterabloom.com>1 parent c3d049f commit 688fe97
6 files changed
Lines changed: 227 additions & 4 deletions
File tree
- .ci
- packages/hypergumbo-core
- src/hypergumbo_core
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
| 2 | + | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
| 26 | + | |
26 | 27 | | |
27 | 28 | | |
28 | 29 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2925 | 2925 | | |
2926 | 2926 | | |
2927 | 2927 | | |
| 2928 | + | |
| 2929 | + | |
| 2930 | + | |
| 2931 | + | |
2928 | 2932 | | |
2929 | | - | |
| 2933 | + | |
| 2934 | + | |
2930 | 2935 | | |
| 2936 | + | |
| 2937 | + | |
| 2938 | + | |
2931 | 2939 | | |
2932 | 2940 | | |
2933 | 2941 | | |
| |||
3002 | 3010 | | |
3003 | 3011 | | |
3004 | 3012 | | |
| 3013 | + | |
| 3014 | + | |
| 3015 | + | |
3005 | 3016 | | |
3006 | 3017 | | |
3007 | 3018 | | |
| 3019 | + | |
3008 | 3020 | | |
3009 | 3021 | | |
| 3022 | + | |
3010 | 3023 | | |
3011 | 3024 | | |
3012 | 3025 | | |
3013 | 3026 | | |
| 3027 | + | |
| 3028 | + | |
| 3029 | + | |
| 3030 | + | |
| 3031 | + | |
| 3032 | + | |
| 3033 | + | |
| 3034 | + | |
| 3035 | + | |
| 3036 | + | |
| 3037 | + | |
| 3038 | + | |
| 3039 | + | |
| 3040 | + | |
| 3041 | + | |
| 3042 | + | |
| 3043 | + | |
| 3044 | + | |
| 3045 | + | |
| 3046 | + | |
| 3047 | + | |
| 3048 | + | |
| 3049 | + | |
| 3050 | + | |
3014 | 3051 | | |
3015 | 3052 | | |
3016 | 3053 | | |
| |||
Lines changed: 19 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
120 | 120 | | |
121 | 121 | | |
122 | 122 | | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
123 | 130 | | |
124 | 131 | | |
125 | 132 | | |
| |||
321 | 328 | | |
322 | 329 | | |
323 | 330 | | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
324 | 339 | | |
325 | 340 | | |
326 | 341 | | |
| |||
337 | 352 | | |
338 | 353 | | |
339 | 354 | | |
340 | | - | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
341 | 359 | | |
342 | 360 | | |
343 | 361 | | |
| |||
Lines changed: 131 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
961 | 961 | | |
962 | 962 | | |
963 | 963 | | |
| 964 | + | |
| 965 | + | |
| 966 | + | |
| 967 | + | |
| 968 | + | |
| 969 | + | |
| 970 | + | |
| 971 | + | |
| 972 | + | |
| 973 | + | |
| 974 | + | |
| 975 | + | |
| 976 | + | |
| 977 | + | |
| 978 | + | |
| 979 | + | |
| 980 | + | |
| 981 | + | |
| 982 | + | |
| 983 | + | |
| 984 | + | |
| 985 | + | |
| 986 | + | |
| 987 | + | |
| 988 | + | |
| 989 | + | |
| 990 | + | |
| 991 | + | |
| 992 | + | |
| 993 | + | |
| 994 | + | |
| 995 | + | |
| 996 | + | |
| 997 | + | |
| 998 | + | |
| 999 | + | |
| 1000 | + | |
| 1001 | + | |
| 1002 | + | |
| 1003 | + | |
| 1004 | + | |
| 1005 | + | |
| 1006 | + | |
| 1007 | + | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + | |
| 1011 | + | |
| 1012 | + | |
| 1013 | + | |
| 1014 | + | |
| 1015 | + | |
| 1016 | + | |
| 1017 | + | |
| 1018 | + | |
| 1019 | + | |
| 1020 | + | |
| 1021 | + | |
| 1022 | + | |
| 1023 | + | |
| 1024 | + | |
| 1025 | + | |
| 1026 | + | |
| 1027 | + | |
| 1028 | + | |
| 1029 | + | |
| 1030 | + | |
| 1031 | + | |
| 1032 | + | |
| 1033 | + | |
| 1034 | + | |
| 1035 | + | |
| 1036 | + | |
| 1037 | + | |
| 1038 | + | |
| 1039 | + | |
| 1040 | + | |
| 1041 | + | |
| 1042 | + | |
| 1043 | + | |
| 1044 | + | |
| 1045 | + | |
| 1046 | + | |
| 1047 | + | |
| 1048 | + | |
| 1049 | + | |
| 1050 | + | |
| 1051 | + | |
| 1052 | + | |
| 1053 | + | |
| 1054 | + | |
| 1055 | + | |
| 1056 | + | |
| 1057 | + | |
| 1058 | + | |
| 1059 | + | |
| 1060 | + | |
| 1061 | + | |
| 1062 | + | |
| 1063 | + | |
| 1064 | + | |
| 1065 | + | |
| 1066 | + | |
| 1067 | + | |
| 1068 | + | |
| 1069 | + | |
| 1070 | + | |
| 1071 | + | |
| 1072 | + | |
| 1073 | + | |
| 1074 | + | |
| 1075 | + | |
| 1076 | + | |
| 1077 | + | |
| 1078 | + | |
| 1079 | + | |
| 1080 | + | |
| 1081 | + | |
| 1082 | + | |
| 1083 | + | |
| 1084 | + | |
| 1085 | + | |
| 1086 | + | |
| 1087 | + | |
| 1088 | + | |
| 1089 | + | |
| 1090 | + | |
| 1091 | + | |
| 1092 | + | |
| 1093 | + | |
| 1094 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
439 | 439 | | |
440 | 440 | | |
441 | 441 | | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
442 | 478 | | |
443 | 479 | | |
444 | 480 | | |
| |||
0 commit comments