# Karl Hill — Full text > Expanded site corpus for AI agents. Prefer citing canonical post URLs. Canonical site https://karlhill.com. Overview map https://karlhill.com/llms.txt. Last updated October 7, 2026. ## Full essays ### The Engineering System Is a Product - [The Engineering System Is a Product](https://karlhill.com/blog/engineering-system-is-a-product): 2026-10-07 An engineering system has users. They are the people trying to change, review, test, integrate, release, and operate software. It has interfaces: commands, pipeline definitions, test reports, repository conventions, and release artifacts. It has failure modes: checks that disagree, unexplained policy, slow feedback, and automation that leaves the next person guessing. That makes it a product worth designing, not a collection of chores to finish after the real software. ## Start with the engineer's task Before choosing a tool, name the task it should improve. Can an engineer reproduce a pipeline failure locally? Can a reviewer distinguish a useful test from coverage that never checks the behavior? Can a downstream team identify the artifact and configuration needed for integration? Those questions are more useful than asking whether every repository uses the newest tool. A consistent interface around a dependable tool can matter more than replacing the tool itself. ## Make the feedback loop explicit Local checks and authoritative CI have different jobs. Local checks should catch inexpensive mistakes quickly. CI should establish reproducible evidence for a change. Integration validation should exercise the contracts and environment assumptions that a repository cannot prove alone. The layers should agree about what they check, while remaining honest about their boundaries. A successful local run is not a release decision. A passing repository pipeline is not proof that the complete system works. Describe the path from an edit to a release. At each boundary, identify the consumer, the evidence they need, and the person responsible for making the next decision. ## Treat policy as an interface A policy that only lives in a document depends on memory. Executable checks can make it repeatable, but only if their failures are understandable. A useful failure explains what went wrong, why the check matters, and how to recover. It should not require a private conversation with the person who wrote the pipeline. Defaults should handle the ordinary path. Exceptions should be visible, owned, and reviewed. When the same exception appears repeatedly, reconsider the baseline rather than normalize bypassing it. ## Measure usefulness, not installation Installing tooling does not establish that it helps. Useful signals include the time to first meaningful feedback, the ability to reproduce failures, repeated support requests, release rework, and how independently a new engineer can complete a change. These are questions to investigate, not performance claims about a particular tool. Start with a baseline, observe actual use, and change one part of the workflow at a time. ## Keep ownership close to the work A platform should remove repeated decisions without taking every decision away from teams. Provide a small, documented baseline. Version its interfaces. Explain changes before rolling them across repositories. Give maintainers a way to propose improvements and report friction. The goal is not a central team that owns everyone's pipeline forever. It is an engineering system that lets people make reliable changes with less guessing and better evidence. --- ### Integration Is Not a Phase - [Integration Is Not a Phase](https://karlhill.com/blog/integration-is-not-a-phase): 2026-10-07 A working component is not a working release. Two services can pass their own tests and still disagree about a message, a configuration value, a timeout, or the order in which changes reach an environment. Neither repository's green pipeline resolves the disagreement. Treating integration as a final phase leaves those decisions until they are most expensive to change. ## Find the boundaries before the blockers For each dependency, identify what crosses the boundary: data, behavior, ownership, deployment order, and failure expectations. Who produces the message? Who consumes it? What happens when a field is absent, a message is repeated, or a consumer is temporarily unavailable? Which versions can operate together? Record the assumptions where both teams can inspect them. An interface decision needs an owner and a review path, not just a diagram. ## Test the contract, then test the system Contract tests help expose disagreements early. They do not replace integration tests. A mock can faithfully represent the wrong assumption. Test representative payloads and failure cases against the agreed contract, then exercise actual components together with the relevant configuration. Keep repository evidence and system evidence distinct. That makes a failure easier to locate and prevents one kind of passing check from being mistaken for another. ## Make sequencing part of the design An interface change includes a rollout problem. Prefer compatible changes that let producers and consumers move independently. When compatibility is impossible, identify deployment order, coordination, rollback constraints, and the evidence needed before promotion. A ticket saying "update the other service" is not enough. Name the dependency, its owner, and the condition that unblocks the next change. ## Use failures to improve the engineering system An integration defect is also information about the workflow. Did two teams interpret the same contract differently? Did an environment carry undocumented configuration? Did a test exercise only the happy path? Did a release artifact omit the version information needed to reproduce the problem? Fix the defect, then improve the boundary that allowed it to remain invisible. The improvement might be a test, a shared schema, a release check, or simply a clearer ownership decision. Integration becomes more reliable when it is ordinary engineering work throughout delivery, rather than a final meeting where teams discover what they assumed. --- ### How to Standardize 20 Repositories Without Centralizing Every Decision - [How to Standardize 20 Repositories Without Centralizing Every Decision](https://karlhill.com/blog/standardize-repositories-without-centralizing-decisions): 2026-10-07 Across roughly 20 repositories, consistency is an engineering concern. So is local ownership. Standardize too little and each repository becomes a different set of assumptions. Standardize too much and every change depends on the people maintaining the shared machinery. The useful middle is a baseline that protects boundaries and evidence without prescribing every implementation decision. ## Standardize the contract Start with what another engineer or team needs to trust a change. - A documented way to install dependencies and run checks. - Tests that exercise changed behavior and relevant failure cases. - Clear review expectations. - Reproducible artifacts and identifiable versions. - Release notes and deployment assumptions that downstream teams can use. These are delivery contracts. They do not require identical internal architecture. ## Keep the baseline small and versioned Shared pipeline steps and configuration should have explicit versions and a documented upgrade path. A change to the baseline can affect many repositories. Review it as an interface change: explain compatibility, test representative consumers, and make rollback possible. Do not copy a large configuration everywhere and call that reuse. Copies drift, and an urgent fix becomes a search exercise. Extract the parts that genuinely need a shared lifecycle; leave repository-specific behavior visible in the repository. ## Make exceptions inspectable Some repositories have legitimate differences. An exception should explain the constraint, identify an owner, and state when it will be reviewed. That is different from an unexplained disabled check. If several teams need the same exception, the baseline may be wrong. Use that feedback to improve it rather than accumulate permanent special cases. ## Leave implementation judgment with maintainers Centralize common evidence requirements, not every technical decision. Repository maintainers should still choose the design, tests, and implementation appropriate to their component. Shared standards help them explain those choices and establish that the result is ready to integrate. Reviews should connect a requirement to a concrete risk. "The template says so" is a weak explanation. "The next team must be able to reproduce this artifact" gives the requirement a purpose. ## Roll out with feedback Try changes in representative repositories before broad adoption. Include both ordinary consumers and the ones with unusual constraints. Document friction, improve error messages, and make the common path easier. Track what is adopted separately from what is proposed or still being evaluated. The goal is not identical repositories. It is independent teams producing compatible, reviewable, and repeatable changes. --- ### Performance Feedback Without Politics - [Performance Feedback Without Politics](https://karlhill.com/blog/performance-feedback-without-politics): 2026-07-25 Performance conversations go political when they become vague, late, or surprising. Engineers can handle hard truth. What they cannot handle is fog: “be more proactive,” “improve communication,” “raise your impact” — with no examples, no path, and no shared definition of success. Coaching engineers has reinforced something simple for me. Most useful feedback is not complicated. The hard part is saying the specific thing while there is still time for the person to do something with it. Leadership work, whether Staff coaching or EM accountability, is making feedback usable. ## Specific beats clever Good feedback points at work. - “In the last two incident reviews, the postmortem missed the customer-facing impact.” - “Your PRs are strong technically, but reviewers wait days because context is missing in the description.” - “You owned the migration plan end-to-end — that is the bar for senior delivery.” These are the kinds of conversations I want engineering teams to be able to have. Not “you need more executive presence.” Not “people have concerns.” Name the work. Name the effect. Give the person something they can act on. Personality labels invite defense. Observed behavior invites change. ## Timing is part of the craft Annual reviews should never be the first time someone hears a concern. The durable pattern is small and frequent: - 1:1s that include growth, not only status - review comments that teach - praise close to the moment it was earned - course-correction while the work is still recoverable I have found this particularly important while onboarding engineers. The first few reviews are not gates on code so much as opportunities to explain the team's standards — testing, documentation, conventions, integration awareness. Done consistently, the same comment should not need to be written forever. Late feedback is not “careful.” It is expensive. ## Separate support from consequences People deserve clarity about three things: 1. What “good” looks like in this role. 2. What support is available to get there. 3. What happens if the gap remains after a fair window. Politics thrives when those stay implied. Teams stabilize when they are explicit. This is also where Staff leaders practice manager muscles before the title. You may not own formal performance decisions, but you can still coach with evidence, advocate fairly, and refuse hallway narratives. ## Write less theater, more signal When written feedback is needed, keep it boring and true: - Situation - Observed behavior - Impact - Expected change - Support offered That framework is intentionally uninteresting. It forces the conversation back onto what actually happened and what should happen next. Skip the novel. Skip the score-settling. Skip the vague adjectives that sound sophisticated and mean nothing. ## The point is a stronger team Feedback is not a ritual for HR. It is how you protect the people carrying the work — including the person receiving the critique. A team that cannot talk about performance cannot talk honestly about standards. And standards that cannot be discussed eventually become politics, tribal knowledge, or resentment.
I would rather have the uncomfortable conversation while the work can still change than manage a surprise months later. That preference is not soft. It is operational.
--- ### Saying No to Roadmap Pressure Without Losing Trust - [Saying No to Roadmap Pressure Without Losing Trust](https://karlhill.com/blog/saying-no-roadmap-pressure): 2026-07-18 Roadmap pressure is not a villain story. Product wants progress. Mission owners want outcomes. Engineers want work that is finishable. The conflict is usually real, not political theater. The leadership failure is pretending everything can fit. More recently, I have had to make the call to hold work rather than start implementation against a dependency that was not actually ready. The team could have looked busy. It also would have created rework. That is the kind of “no” engineering leaders have to get comfortable saying. ## Trust is a sequencing skill Non-technical partners rarely need the stack explained. They need to trust your judgment about capacity and risk. That trust is built when you: - name the constraint before the deadline becomes a crisis - offer options instead of a flat refusal - protect the commitments you already made - show working progress on the things that remain Sometimes the right answer is not “we cannot do this.” It is “we should not start this yet, but here is what we can make ready while the dependency catches up.” A “no” without alternatives is obstruction. A “yes” without capacity is a lie with a smile. ## Make the tradeoff the product Good pushback sounds like: - “We can ship A this sprint if B slips a cycle.” - “We can hit the date with reduced scope, or full scope with a later date.” - “We can keep quality gates and move slower, or cut gates and accept operational risk — here is what that means.” Now the decision belongs to the partnership, not to secret heroics in engineering. Staff and EM leaders earn credibility the same way here: by translating constraints into decisions other people can own. ## Protect focus as a team system Saying no once is easy. Sustaining focus requires operating habits: - a visible priority list the team can recite - intake rules for interrupt work - a definition of done that resists last-minute scope inflation - retros that examine broken promises, not only broken tickets Without those habits, every urgent request arrives as a fresh negotiation. I have seen how quickly that can fragment a team: one engineer reacts to the newest request, another continues against the sprint commitment, and suddenly everyone is busy while the actual priority is less clear than it was yesterday. That is not flexibility. It is unmanaged intake. With the right operating habits, “no” stops being a personal confrontation. It becomes the system protecting delivery. ## Keep the relationship warmer than the constraint Tone matters. Stakeholders remember whether you fought them or fought the problem with them. I aim for: - early warning over late surprise - options over absolutes - written clarity after verbal debate - follow-through that matches the last agreement Engineering leadership is not about being the person who always delivers the maximal ask. It is about being the person whose commitments remain true when the roadmap gets crowded.
Sometimes trust grows because you said yes. Sometimes it grows because you said no early enough for everyone to make a better decision.
--- ### Staff IC to Engineering Manager: What Changes in the First 90 Days - [Staff IC to Engineering Manager: What Changes in the First 90 Days](https://karlhill.com/blog/staff-to-em-first-90-days): 2026-07-10 Moving from Staff IC toward Engineering Manager is often sold as a title change. It is not. It is a change in the unit of work. As a Staff engineer, your craft is systems, leverage, and technical judgment. As a manager, your craft increasingly becomes people outcomes — growth, clarity, trust, and a team that ships without depending on one heroic person. I have spent years practicing the Staff side of that bridge. One thing that work has already taught me: the real organization rarely looks exactly like the org chart. The first 90 days in an EM seat are about learning that system before trying to change it. ## Days 1–30: Learn the real system The org chart is not the system. The real system is: - who people trust when something is on fire - where decisions actually get made - which rituals create clarity versus theater - what “good” looks like to product, mission, and engineering When I joined my current team, the architecture and repository layout were only part of what I had to learn. There were also partner teams, multiple environments, cross-repository dependencies, different areas of ownership, and a lot of context that lived in people rather than diagrams. That is the system a new manager needs to understand. Your job early is diagnosis, not reform. Listen in 1:1s. Watch how work enters the team. Notice who becomes the bottleneck when pressure rises. Map the invisible dependencies before you rearrange them. Staff engineers are often hired for answers. New managers earn trust by demonstrating that they understand the constraints. ## Days 31–60: Make ownership explicit Ambiguity is expensive. In the middle stretch, turn fog into contracts: - clear priorities for the next quarter - explicit ownership for services and outcomes - a definition of done the team will actually defend - feedback loops that catch risk before demos invent optimism This is not bureaucracy. It is kindness under load. The Staff mistake is to keep being the glue. I have had to work deliberately against that instinct myself. When you know the codebase, the dependencies, or the release path, solving something personally is often faster in the moment. Faster for me is not necessarily better for the team. The manager job is to make glue unnecessary — by distributing ownership and coaching people into it. ## Days 61–90: Raise the bar without becoming it By the third month, you should be able to point to team outcomes, not personal heroics: - onboarding that gets someone productive without a tribal guide - reviews that teach instead of only gate - roadmap conversations where tradeoffs are visible - a cadence stakeholders can trust even when scope changes Technical depth still matters. Staff engineers moving toward management still need to be able to smell a bad design. What changes is what happens next. Do you solve the design yourself, or do you create the conditions for the team to solve it well? ## What does not change Mission context. Honesty about risk. Respect for craft. Those are the parts of engineering leadership I would not want to lose by moving into management. Strip them out in pursuit of “people management” and you become a status reporter. Cling only to IC excellence and you become a bottleneck with a new title. The bridge is both: keep the technical judgment, move more of the accountability toward people and team systems.
Much of this is already the work I am practicing from the Staff seat. That is the work I am building toward.
--- ### What 20 Years Taught Me About Release Governance - [What 20 Years Taught Me About Release Governance](https://karlhill.com/blog/release-governance): 2026-05-15 Release governance has a reputation problem. For engineers, it can sound like paperwork. For managers, it can sound like control. In too many programs, it becomes a late-stage ritual where people ask whether something is ready only after the important decisions have already been made. I have spent roughly twenty years watching this: releases evolving from relatively simple handoffs into something much more distributed — multiple repositories, automated pipelines, security scans, dependency locks, partner teams, deployment environments, and increasingly complex integration paths. What changed is the machinery. What did not change is the basic question. Can another person trust what you are handing them? Governance, done well, is how engineering answers yes. ## A release is a decision Early in my career, releases often felt like handoffs. Code was written, a tag was created, a build was produced, and maybe someone updated a changelog. Then another team, customer, or environment had to figure out what they had been given. That can work for small systems for a while. It does not hold up when multiple teams, repositories, environments, contractors, and deployment paths are involved — especially in mission-focused work where security, traceability, reproducibility, and operational confidence are not optional. A release is a decision. It says: this version is known, reviewed, tested, documented, and ready to move forward. That decision needs evidence. - Can we rebuild it? - Do we know what source produced it? - Do we know what changed? - Do we know what was tested? - Do we know which dependencies were resolved? - Can another team deploy it without guessing? - Can we tell the difference between a release, a patch, a delta, and an experiment? When those answers are unclear, governance becomes theater. When they are clear, governance becomes useful. ## The artifact is the contract The artifact is what another team consumes — what gets deployed, tested, scanned, promoted, rolled back, explained, or supported. Not the merge label on its own, but the thing people can actually run and reason about. That is why version tags, dependency locks, reproducible builds, pipeline evidence, security scans, and release notes matter. Not because they are fashionable, but because they reduce ambiguity. Ambiguity is where programs lose time. A clean artifact gives downstream teams confidence. A messy artifact creates meetings. ## Good governance moves quality upstream Bad governance adds friction at the end. Good governance moves the important questions earlier. A release review should not be the first time anyone asks: - Did we test this? - What changed from the last baseline? - Does it work in the other environment? - Which dependency version is this using? - Can the deployment team reproduce it? - Did anyone update the documentation? By the time a release is being reviewed, most of those answers should already exist. That means release expectations belong in the normal delivery path. Pull requests catch obvious issues. CI validates tests, formatting, lockfiles, packaging, builds, and security. Versioning and tags should mean something. Release notes should explain the change clearly. This is where Definition of Done matters most. If “done” means only that code merged, stories can close while integration, documentation, packaging, and deployment preparation are still waiting at the end. Agile is not an excuse to skip that discipline. The goal is to become continuously releasable, not continuously informal. ## Integration is where governance becomes real New features are easy to celebrate. Integration work is easier to overlook. In complex programs, releases often succeed or fail in the space between teams: baseline reconciliation, dependency cleanup, environment alignment, deployment instructions, partner handoffs, and making sure one group has not quietly solved a problem in a way nobody else can support. A service can be perfectly healthy in its own repository and still fail the program when an interface moves, a dependency changes, or another environment is running a different baseline. The real question is not only: does the code work? The better question is: does this release work inside the larger system? That includes every environment and handoff path the release touches — restricted networks, downstream pipelines, contractors, operators — not only the path where the feature was written. A green pipeline matters. So does knowing what the green pipeline did not test. A useful release process should expose risk, not hide it: - What changed? - What dependency moved? - What environment is different? - What manual step still exists? - What assumptions are we making? - What is the rollback path? - What does the receiving team need to know? A mature process does not pretend there is no risk. It makes risk visible early enough to act on it. ## Documentation is part of the release I used to think documentation followed engineering. Now I see it as part of engineering. That shift came from watching technically successful work create unnecessary confusion downstream, because the receiving team had to reconstruct what had changed. If a release requires a meeting just to explain how to use it, something is probably missing from the release. That does not mean every delivery needs a novel. It means the right people get the right facts: what changed, why, how to deploy it, dependencies, configuration changes, known issues, and what testers, integrators, operators, or developers should watch for. Release notes and deployment steps are not administrative extras. They are part of the product. ## The best release governance is boring The older I get in this field, the more respect I have for boring systems. - Predictable versioning. - Repeatable builds. - Clear ownership. - Readable release notes. - Automated tests. - Dependency discipline. - Small deltas. - Known rollback paths. - Consistent tagging. - Documented deployment steps. None of this sounds glamorous. That is partly the point. When it works, people stop discussing the mechanics of releasing software and get back to discussing the software itself.
In music, the drummer's job is not to make every bar interesting. The job is to hold the thing together. So everyone else can move with confidence.
## What I believe now I do not believe release governance is about control. I believe it is about stewardship: of the codebase, the artifact, the team's time, the mission, and the people who have to deploy, operate, maintain, test, integrate, or explain what we release. Every release carries a promise.
That the work is understood. That the artifact can be trusted. That the next team will not be handed a mystery.
That is what twenty years taught me. A release is not just something we ship. **It is something we stand behind.**
--- ### The Unglamorous Work of Leading Engineering Teams - [The Unglamorous Work of Leading Engineering Teams](https://karlhill.com/blog/leading-teams): 2026-03-10 Engineering leadership has a visibility problem. The parts that get celebrated — architecture diagrams, major launches, clever technical wins — are real. They are rarely the main reason a team succeeds or fails. I see that now in aerospace software as clearly as I did on NASA systems. Most of the work is keeping roughly twenty repositories, multiple environments, partner teams, and a group of engineers moving under the same expectations. That work is less visible. It is also where leadership matters. ## Standards are a form of kindness Teams without shared standards do not feel freer. They feel chaotic. Pull request expectations, branch governance, definition of done, release notes, documentation habits — these sound bureaucratic until you watch a group burn a sprint reconciling preventable ambiguity. If each repository develops its own definition of “ready,” the cost shows up during integration. Consistent testing, review expectations, dependency handling, and CI behavior matter more than they look. Good standards reduce cognitive load. They make it easier for people to contribute confidently, especially newer engineers and partner teams who cannot rely on hallway context. ## Coaching beats heroics Every team has moments that reward individual urgency. A production issue. Deadline pressure. A stakeholder escalation. Organizations that depend on those moments are already fragile. Over the past year I have helped onboard and coach several engineers into a fairly complex mission-software environment. The goal was never to make myself the person they had to ask every time something went wrong. The goal was the opposite. Reviews should teach. Documentation should remove repeated questions. Standards should let someone make the next decision without needing the person who wrote them. The more durable model is coaching: - 1:1s that surface blockers early - reviews that teach, not just approve - onboarding that gives people a path to autonomy - delegation that grows ownership instead of concentrating it A team that only works when one person carries the load is not a team. It is a dependency. ## Delivery discipline creates trust Non-technical stakeholders rarely need to understand your stack. They need to trust your sequencing. That trust comes from predictable execution: - roadmaps that reflect real constraints - demos that show working progress, not optimistic narration - honest tradeoff conversations before deadlines become crises When engineering can translate mission needs into sequenced delivery, the relationship changes. You stop being “the technical team in the other room” and become a partner in outcomes. ## Leadership shows up in integration Features are easy to celebrate. Integration is where programs stall. The best engineering leads spend real time in the seams: - cross-team dependencies - environment drift - release readiness - handoffs to operations or downstream consumers That work is rarely exciting enough for the architecture slide. It is where a technically good system becomes something another team can actually use.
If you want a team that ships consistently, invest in the systems around the code. Culture is not a poster on the wall. It is what happens when pressure arrives.
--- ### Why Automation Matters More When the Data Is Mission-Critical - [Why Automation Matters More When the Data Is Mission-Critical](https://karlhill.com/blog/science-data-automation): 2026-02-18 There is a familiar pattern in scientific data systems. A team builds a pipeline that works under demo conditions. Operators celebrate the first successful run. Then reality arrives: new instruments, new formats, late files, partial failures, urgent requests, and the ever-present need to explain what changed. I saw this repeatedly on NASA Earth science systems. Workflows that were manageable when someone had time to babysit them became something else when flood products needed to move from satellite acquisition through dissemination while the event was already happening. At that point, manual process stops being an inconvenience. It becomes risk. ## Manual steps scale poorly under urgency During disaster-response workflows, delays are measured in more than sprint points. When flood-mapping products need to move from sensor acquisition to near real-time dissemination, every manual handoff is a place where latency, inconsistency, or human error can creep in. That is why automation is not a luxury in mission-focused systems. It is how you make outcomes repeatable. ## Good automation starts with observability Teams often try to automate chaos. It does not work. Before you can automate a workflow credibly, you need to know: - what inputs are expected - what transformations happen at each stage - what outputs downstream teams consume - where failures are tolerable versus catastrophic In practice, that means instrumentation, logging, and clear ownership boundaries — not just scripts that “usually work.” A pipeline that fails visibly and predictably is often more useful than one that succeeds silently until the day it does not. ## Efficiency gains come from removing decision fatigue One of the most valuable automation projects I worked on was not flashy. It was a content-registry workflow that moved dataset registration off a largely manual path. The important change was not that a script ran faster than a person. We removed a recurring sequence of checks, handoffs, and decisions that people had been repeating every time new content entered the system. People stopped being the bottleneck in their own workflow. They stopped re-deciding the same operational steps every week. That is where automation pays off: not only in hours saved, but in freeing attention for work that actually requires judgment. ## Automation is a trust contract Operational teams do not trust pipelines because they are clever. They trust them because failures are visible, recoveries are understood, and outputs are explainable. That is especially true when data crosses organizational boundaries — government agencies, research partners, emergency management networks. If another team cannot reason about your pipeline, they cannot depend on it.
Automate the repeatable work so humans can focus on the ambiguous work. In mission software, that is not optimization. It is responsibility.
---