def base(owner, viewer, now, expires_at):
    return owner == viewer and now < expires_at

def head(owner, viewer, now, expires_at):
    # AIが書いた変更（期限ちょうどを有効にしてしまっている）
    return owner == viewer and now <= expires_at

def fixed(owner, viewer, now, expires_at):
    return owner == viewer and now < expires_at

def harmful_fix(owner, viewer, now, expires_at):
    # 「上流で認証済みだからowner照合は不要」という誤った指摘に従った例
    return now < expires_at

cases = [
    ("有効な本人", ("alice", "alice", 9, 10), True),
    ("期限ちょうど", ("alice", "alice", 10, 10), False),
    ("期限後", ("alice", "alice", 11, 10), False),
    ("有効期間の別人", ("alice", "bob", 9, 10), False),
]

for fn in (base, head, fixed, harmful_fix):
    failed = [name for name, args, expected in cases if fn(*args) != expected]
    print(fn.__name__, failed)
