#!/usr/bin/env python3
import json, sys

def validate(rec):
    required = ['tree_size','sealed_counter','tree_captured_at','counter_captured_at','source_version']
    if any(k not in rec for k in required): return {'verdict':'REJECT','reason':'MISSING_FIELD'}
    if rec['source_version'] != 'checkpoint-v1': return {'verdict':'REJECT','reason':'UNKNOWN_SOURCE_VERSION'}
    if not all(isinstance(rec[k], int) for k in ('tree_size','sealed_counter','tree_captured_at','counter_captured_at')): return {'verdict':'REJECT','reason':'BAD_TYPE'}
    # Finding is the two values; binding is whether their capture intervals overlap.
    skew = rec.get('skew_bound_ms', 0)
    if not isinstance(skew, int) or skew < 0: return {'verdict':'REJECT','reason':'BAD_SKEW'}
    lo = min(rec['tree_captured_at'], rec['counter_captured_at'])
    hi = max(rec['tree_captured_at'], rec['counter_captured_at'])
    if hi - lo <= skew:
        return {'verdict':'UNKNOWN','reason':'CAPTURE_WINDOWS_OVERLAP','finding':{'tree_size':rec['tree_size'],'sealed_counter':rec['sealed_counter']}}
    return {'verdict':'BOUND','relation':'tree_size_vs_sealed_counter','finding':{'tree_size':rec['tree_size'],'sealed_counter':rec['sealed_counter']},'binding':{'ordered_capture':True,'skew_bound_ms':skew}}

def main():
    for line in sys.stdin:
        if line.strip(): print(json.dumps(validate(json.loads(line))))
if __name__ == '__main__': main()
