Development notes
Why small, verifiable increments are more reliable than changing a whole site at once
Use the Button integration trial and article translations to define a deliverable scope for AI collaboration, protect what must stay unchanged, and connect each check to an actual result in use.
- AI collaboration
- Development workflow
- Verification
- Change scope
“Sort out the whole site” is difficult to deliver. That request may include colors, content, components, routes, and interactions all at once. If one change misses expectations, even finding the cause first requires asking what changed together in this round.
I divide work like this into increments that can be checked independently. But small does not mean changing only one file, nor does it mean delivering an empty shell that has not been connected to a page. Each round needs a complete purpose, recognizable boundaries, and a result we can actually check.
The site’s foundational Button integration and English/Japanese article translations were two different kinds of increment. The first established whether a new component could fit the existing site. The second took selected articles from source text to readable multilingual routes. Neither treated doing everything as the only possible unit of completion.
The smallest unit should be a result, not a file
Suppose the goal is to let a reader switch to English on an article page. Completion requires at least the translation, a shared article identity, a valid route, and an entry point linking to that version. Creating an English file alone does not achieve that purpose for readers of the public page if the article is still a draft or the link does not exist.
This is an illustrative requirement, not an account of a translation incident. It reminds me that task boundaries cannot be measured by file count alone.
Conversely, one result may require changes in several places. Integrating Button involves a component, class merging, tokens, and dependencies. Finishing a translation batch may involve adding language files, updating tracking documentation, and rebuilding the relevant lists. More files do not necessarily mean uncontrolled scope. What matters is that every change serves the same purpose.
I usually start with two sentences: what this round should enable someone to do, and what will not change with it. If those two sentences are not clear yet, I do not rush to break the task into implementation steps.
The Button trial first answered a compatibility question
When this site added bejamas/ui, we limited the initial integration to one Button. The library’s other controls were not a reason to replace the entire site with its demonstration style.
That round asked how the component would enter the project, what dependencies it needed, whether it could use the existing colors, and whether link usage actually produced an anchor. Those questions could be traced through the actual changes and generated HTML.
At the time, existing pages did not yet use the new Button. A successful full-site build therefore could not prove that it had rendered. We separately used an isolated fixture that imported the same component and CSS, checking sizes, variants, type, disabled state, links, and class merging.
Although this increment did not replace every production page, it still had a complete result: compatibility of the foundational integration, not site-wide component adoption. Connecting it to production usage, or adding interactive controls that need focus management, remained work for another round.
The Button integration record retains those conditions, including the limitations around restoring dependencies. That fixture passing cannot endorse every later component update.
A translation increment must reach from the source to site output
In the subsequent translation work recorded by the original article on October 12, 2026, we selected a limited set of articles for English and Japanese versions. We did not treat every topic awaiting translation as part of that round.
Each article kept the same stableId across languages, while its title, description, and body were written naturally for each language. Version dates recorded when that translation was completed and admitted to the publishable source, rather than copying historical Traditional Chinese dates. If a source article had said that the English list did not yet contain any articles, the translation needed to identify that as the source article’s historical context, not describe an already populated list as still empty.
This boundary protects two things at once. The new version must be complete, while the owner’s approved Traditional Chinese original must not be casually rewritten during translation. Existing translation records used per-file hashes to confirm that originals had not changed. That checks whether file contents remain identical; it does not replace reviewing the translations for meaning.
After the content is complete, it still needs to reach the site. Does the published collection include the version? Is its article page generated? Do language links actually let readers move between versions? Are the lists and sitemap consistent? Writing the body alone is not enough to claim those integration results are complete too.
Unlike the Button trial, this increment’s deliverable is a complete language version in the publishable source. It therefore cannot stop at an unchecked file. Whether the production host has been updated remains a separate deployment boundary.
Record what must not change first
When making a change, I describe the protected scope as concretely as the additions. The following is an example working format, not a specification every task must copy.
| Question | Boundary for the Button trial | Boundary for translating selected articles |
|---|---|---|
| What does this round add? | A foundational component that can be tested | Complete language versions of the specified source articles |
| What stays unchanged? | The existing information architecture and site-wide design | Approved Traditional Chinese bodies and publication fields |
| What establishes the result? | The component fixture’s actual HTML and relevant checks | Translation review, public pages, language entry points, and content output |
| What cannot also be claimed? | Acceptance of the entire interactive component set | Certification by an external native-language editor, or deployment to the production host |
A protection requirement such as “do not change things carelessly” is difficult to check. For source text, we can compare bytes. For a component integration, we can review global CSS, dependencies, and existing usage points. Different objects need different protection methods; there is no need to force them through the same tool.
When a side issue appears, decide whether it blocks this round’s purpose
Limited scope does not mean ignoring every issue we encounter.
If newly added valid content causes an existing output check to report a false failure, first distinguish between a real content-contract violation and a verifier that does not cover this valid data. We must not delete legitimate content just to make a tool pass. If the verifier needs fixing, retain its existing protections, add a reproducible case, and run the checks again.
This is a way to judge side issues, not a requirement to change code every time we write an article. A layout preference that does not affect this round’s purpose, or a chance to refactor another component, should be recorded separately rather than expanded into a whole-site cleanup.
The useful part of reducing scope is having a basis for this decision: does the issue prevent the promised result from working? If it does, resolve it far enough for that result to work. If it does not, give it a separate scope. “Minimal change” must not conceal necessary fixes, and “improving things while we are here” must not expand authorization.
Finish a round’s content and checks together
If the body, metadata, or query rules change after verification passes, that earlier result is not automatically evidence for the final version. At delivery, we need to know which content the checks covered. We cannot stitch together success messages from different stages.
I separate the delivery report into the result actually added, the checks completed, and what remains unfinished or needs the owner’s judgment. Work outside scope is not silently omitted; its boundary is explicit.
For example, a report for an English/Japanese translation batch could say: “The specified versions have been reviewed and included in local production output; the originals are unchanged. Nothing has been deployed, and the owner still needs to confirm the mobile reading appearance.” This is an example delivery format, not a declaration that any new translation batch has passed tests.
That also means ticking every task off a checklist does not necessarily establish delivery. If the checklist omitted actual routes, main usage points, or necessary authorization, we should correct the completion criteria rather than use the checklist to endorse the result.
Some work cannot be avoided by making increments smaller
Data migrations, permission rules, and contracts across layers sometimes have to hold together. Changing fewer files is not a reason to leave a transitional state in which new and old rules operate simultaneously. This article does not use the site’s static-content experience as proof that those systems can be divided in the same way.
A more suitable approach is to identify the inseparable contract first, then reduce the scope of the remaining work. Even a larger change still needs corresponding verification and rollback conditions. If a partial version cannot be delivered safely, a half-finished result should not be called a completed increment.
Scope of this record
This article uses the site’s existing foundational Button integration and records of multiple article-translation batches, as documented by the original on October 12, 2026, to explain judgments about change scope and completion criteria. The table, hypothetical requirement, and quoted delivery report are methodological examples. No new measurements of working time, error rate, performance, or collaboration efficiency are provided, and there is no claim that smaller batches always take less time than changing everything together.
My choice is to give each round a concrete result we can return to: what changed, what stayed unchanged, and whether the next step needs new authorization. Smaller increments help us understand and verify the work. They are not a reason to stop delivery halfway.