Files
papers/hanzo-temporal-assertion-graph/hanzo-temporal-assertion-graph.tex
zeekayandHanzo Dev b79b939f11 We are based in San Francisco
Every author block and the authorship standard said Los Angeles; Hanzo has
been in San Francisco since at least 2016. The five catalogue PDFs whose
sources changed are rebuilt so papers.hanzo.ai says so too.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-24 16:14:51 -07:00

126 lines
5.2 KiB
TeX

% A Temporal Assertion Graph: valid-time and transaction-time reads, schema as
% assertions, and erasure in an append-only store
\documentclass[11pt]{article}
\usepackage{../shared/hanzocover}
\usepackage{amsmath, amssymb, amsthm}
\usepackage{booktabs}
\usepackage{graphicx}
\usepackage{xcolor}
\usepackage{enumitem}
\usepackage{array}
\usepackage{listings}
\input{../shared/lstlang}
\usepackage{hyperref}
\hypersetup{colorlinks=true,linkcolor=black,citecolor=blue,urlcolor=blue}
% Identifiers set in typewriter do not hyphenate; let a line stretch instead of
% running into the margin.
\setlength{\emergencystretch}{3em}
% The status of a sentence: a figure from a run, a description of code at the
% commit named in the introduction, or a design that has not been built.
\newcommand{\meas}{\textcolor{blue!60!black}{\small[measured]}}
\newcommand{\shipped}{\textcolor{purple!70!black}{\small[in the code]}}
\newcommand{\proposed}{\textcolor{orange!70!black}{\small[proposed]}}
% Measured constants come from results-data.tex, which is read from the run
% artifacts it names. A key that file does not define prints XXX, so no table
% can show a number no run produced.
\newcommand{\ph}{\textbf{XXX}}
\newcommand{\setres}[2]{\expandafter\def\csname res:#1\endcsname{#2}}
\newcommand{\res}[1]{\ifcsname res:#1\endcsname\csname res:#1\endcsname\else\ph\fi}
\input{results-data}
% One row of the Hits@1 table: key prefix, then the label printed for it.
\newcommand{\cronrow}[2]{#2 & \res{#1/all} & \res{#1/se} & \res{#1/st}
& \res{#1/ba} & \res{#1/fl} \\}
% One row of the LongMemEval table.
\newcommand{\lmerow}[2]{#2 & \res{lme/#1/n} & \res{lme/#1/cosfive}
& \res{lme/#1/engfive} & \res{lme/#1/costen} & \res{lme/#1/engten}
& \res{lme/#1/cosmrr} & \res{lme/#1/engmrr} \\}
\newcommand{\op}[1]{\texttt{#1}}
\newcommand{\knowable}{\mathit{knowable}}
\newcommand{\until}{\mathit{until}}
\newcommand{\tv}{t_{\mathrm{v}}}
\newcommand{\tk}{t_{\mathrm{k}}}
\theoremstyle{definition}
\newtheorem{definition}{Definition}
\theoremstyle{plain}
\newtheorem{proposition}{Proposition}
\theoremstyle{remark}
\newtheorem{remark}{Remark}
\title{A Temporal Assertion Graph\\[0.35em]
{\large Valid-time and transaction-time reads, schema as assertions,\\
and erasure in an append-only store}}
\author{
Hanzo AI Research\thanks{Corresponding author: [email protected]} \\
\textit{Hanzo Industries Inc (Techstars '17)} \\
San Francisco, California \\
\texttt{https://hanzo.ai}
}
\date{2026-09-22 \quad Code at \texttt{hanzo-inc/cloud} \texttt{1fffdf408}}
\begin{document}
\hanzocoverpage
\maketitle
\begin{abstract}
\noindent
Hanzo cloud's \texttt{/v1/graph} keeps an organization's entities and relations
in one append-only table of assertions. An assertion states that an entity
stands in a relation to a value from an instant \texttt{at}, optionally until an
instant \texttt{until}, with a source, evidence, the filing identity and a
confidence. The server derives a \emph{knowable} instant, the later of the
filer's own claim and the write. Nothing is updated in place, a retraction is an
assertion, and the only deletion is erasure of a data subject. Every read takes
a valid instant, \texttt{as\_of}, and a transaction instant,
\texttt{as\_known}; versions of a statement correct each other only when one was
learned later; a relation holds one value or several, as the organization
declares; and type, domain, range and cardinality are assertions in the same
table, checked as known when the checked row became knowable. We state the
resolution rule and its properties, among them that an answer as known at an
instant is unchanged by every later write except erasure. We describe the
operations built on it: a diff between two bitemporal points, shortest paths
with a confidence product, erasure with a receipt that verifies against an
audit trail and is refused under litigation hold, deterministic Louvain
communities, and a map-reduce answer that refuses uncited claims.
On the \res{cron/n} covered CronQuestions test questions, answered by one query
plan, a dictionary control, semantica~0.7.0 and the store all score
\res{cron/kg/all}\% Hits@1 and give the same answer to every question, whether
history is filed at one instant or as it happened. The store's median call takes
\res{cron/wire/p50}\,ms and semantica's \res{cron/sem/p50}\,ms. The first run of
the same lane scored \res{cron/first/wire/all}\%, and \res{cron/first/wire/se}\%
on point-in-time questions, because the single \texttt{as\_of} of that version
bounded transaction time and a retraction ended every value of its pair; the
harness then found two defects in the correction. On LongMemEval-S, a retrieval
engine in the same memory stack, which does not use this store, raises session
ALL@5 from \res{lme/all/cosfive} to \res{lme/all/engfive} over cosine similarity
on the same vectors, with no tuning on that benchmark.
\end{abstract}
\clearpage
\tableofcontents
\clearpage
\input{sections/01-introduction}
\input{sections/02-model}
\input{sections/03-time}
\input{sections/04-schema}
\input{sections/05-queries}
\input{sections/06-erasure}
\input{sections/07-evaluation}
\input{sections/08-related}
\input{sections/09-limits}
\input{sections/99-conclusion}
{\small
\bibliographystyle{plain}
\bibliography{references}
}
\end{document}