Repository navigation
Conversation
The first of three stacked pull requests split out of apache#1806 at the review's request; the decision records and scripts/verify follow on top of it. CONTEXT.md records eight terms where ordinary usage or generic tool knowledge misleads, such as "adapter", which names three different things, and the default result builder, which differs between Driver and driver.Builder. Each term names the code it describes. CONTRIBUTING.md gains a "Finding your way around" section that points at it. The documentation fixes: - CONTRIBUTING.md linked the developer setup guide by a path that does not resolve, said "getting setup", and described CircleCI, which the project no longer uses. - README.md's link to the developer setup guide did not resolve. - writeups/developer_setup.md installed with `pip install '.[dev,test]'`, which installs neither the dev nor the test dependency group, and its test section described CircleCI, .ci/ scripts and requirements-test.txt, none of which exist. It now installs with `uv sync --group test` and says where CI's exact commands live. - The SQL lineage records 2609-02 and 2609-03 now cite each other by their own numbers.
The second of three stacked pull requests split out of apache#1806 at the review's request, on the glossary and documentation fixes. writeups/adr/2611-02 to 2611-09 record why Hamilton's foundations are as they are: functions define nodes; function modifiers resolve in a fixed lifecycle; deprecations follow a warn/fail version contract; integrations load through an autoloaded registry; data I/O goes through registered loaders and savers; lifecycle adapters replace graph adapters; packages ship as apache-hamilton* with sf-hamilton* redirects; released artifacts do not phone home. Each record was written after the fact, from the code, its commits, the pull requests that carried them (on stitchfix/hamilton for those from before 2023), their issues, and the Incubator mailing-list threads. Its status is `Reconstructed from codebase`, which writeups/adr/README.md adds to its list: the record documents a decision the code already embodies, names where that decision was made, and claims no acceptance of the record itself. What those discussions recorded about rationale, alternatives and consequences is quoted and linked; where they recorded nothing, the record says so. Every source is linked by a stable URL: pull requests and issues by full URL, commits by full SHA, and file:line citations as permalinks at a commit on main. CONTEXT.md links the function-modifier record, and CONTRIBUTING.md points at the records.
This was referenced Nov 10, 2026
Collaborator
Author
|
@skrawcz @elijahbenizzy @zilto Please see the ADRs, and especially the sections where "reasoning could not be recovered fully". If you remember why these things are the way they are, I'd be happy to replace what the AI figured out with your testimony. |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The problem: a contributor, person or AI agent, can't learn from the repository why Hamilton's foundations are built as they are: why a function's name is its node, or why integrations autoload. The reasoning sits in old commits, pull requests on two GitHub homes and mailing-list threads, or nowhere, so a change can reopen a settled question.
What changes: eight decision records,
writeups/adr/2611-02to2611-09, with their index rows (listed below). Each carries the statusReconstructed from codebase, whichwriteups/adr/README.mdadds: written after the fact, from the code and its history, for a decision the code already embodies, claiming no acceptance of the record itself. Each quotes and links what the pull requests and threads where its decision was made record, and says where they record nothing.CONTEXT.mdlinks the function-modifier record, andCONTRIBUTING.mdpoints at the records.Where this sits: split out of #1806 at the review's request into three stacked pull requests, one commit each:
scripts/verify.They merge bottom-up, each rebased onto
mainafter the one below lands; until #1808 lands, GitHub shows its commit here too.Shown working, at bef7e00 (the two scripts are described below):
uv run prek run --all-files --hook-stage pre-merge-commit: passes, license headers included.python3 urlcheck.py writeups/adr/2611-0[2-9]-*.md:249 URLs, 0 failed.python3 linkcheck.py . bef7e00f:11 Markdown files, 18 relative links checked, 0 problems.pull_requestfilter.Decisions (no decision record is reopened; reasons are folded below): the author's calls are the status
Reconstructed from codebase, reading the pull requests where each decision was made, and three stacked pull requests; sources are linked by stable URL, and what a discussion says is attributed and linked.Debt left:
main, nearly all ef88b1e, and nothing flags a record whose code later changes.Before and after (an illustrative example). Task: make Hamilton load its integrations lazily.
hamilton/registry.py, see every extension imported up front, and propose a lazy mode, not knowing one was built and dropped in added environment variable to disable extensions autoload #1095, or why opt-in loading was rejected there.The eight records
apache-hamilton*, withsf-hamilton*redirects;How they were written, and how the checks work
The records were written from the code at
main(ef88b1e), the commits, the pull requests that carried them (on stitchfix/hamilton for those from before the move in February 2023, whose numbers did not carry over), their issues, and the dev@ and general@ threads. What those discussions record about rationale, alternatives, who decided and consequences is quoted, attributed and linked. Where they record nothing, the record says so. Every source is linked by a stable URL: pull requests and issues by full URL, commits by full SHA, andfile:linecitations as permalinks at ef88b1e, except one historical citation at e00f144.urlcheck.pyandlinkcheck.pyare short scripts of mine, kept outside the repository:urlcheck.pyfetches every URL in the files it is given. Pull requests, issues, commits and their comment and review anchors go through the GitHub API, along with the line each permalink names; mailing-list threads through the archive's API, which fails for an unknown thread; other pages over HTTP.linkcheck.py <repo> <commit>checks that every relative link in the Markdown files the commit changes resolves in that commit's tree, and that those files mention no glossary, record or harness file the tree lacks.Decisions, with their reasons
Reconstructed from codebase, rather thanProposed, which the review asked for, orAccepted (retroactive; …), as first proposed in Add scripts/verify, a command that runs the checks CI runs, one recipe per area #1806.apache/hamilton#Ninside a repository file.What the pull requests, issues and threads added, record by record
_prefix.augmentdecorator dropped in review.pipe,dynamic_transformandmodelkeep their deprecation schedule, and warn withFutureWarning#1804 found.mainthrough dynamic task spawning + grouped execution #220.Anyloaders come last (Supports "Any" in loader types #536).apache-hamilton.