tech#github-copilot#agent-mode#coding-agent#github#development-workflow

How GitHub Copilot and I Split the Work of Building Memolog

Published 👁
How GitHub Copilot and I Split the Work of Building Memolog

Why I Wrote This Article

Memolog is an Astro blog deployed on Azure Static Web Apps. Over time, I have expanded it with Azure Functions, Table Storage, Azure AI Translator, Application Insights, and other services.

I built much of the code with GitHub Copilot. Looking back, though, the division of work was not as simple as “I wrote the requirements, and Copilot wrote the code.”

For this retrospective, I cross-checked past conversation logs, GitHub Issues, pull requests, commits, and the repository’s current rules to clarify which responsibilities I kept and which I delegated to Copilot.

Table of Contents

Key Takeaway

In one sentence, this is how Copilot and I divide the work:

I decide why to build something, which approach to adopt, and what I am accountable for. Copilot accelerates research, organization, implementation, and validation.

Even when I delegate implementation to Copilot, I still decide the priority of requirements, the acceptable Azure cost and security constraints, the intended user experience, and whether a change should go to production. Copilot, meanwhile, has been especially effective at finding related code, comparing options, iterating on fixes, running tests, and checking production state.

The development workflow itself has also evolved.

Evolution of Memolog development from Agent Mode to cloud agent collaboration and issue-first local implementationEarlyAgent Mode firstShape requirements and designContinue from plan to codeMiddleCloud agent addedCreate PRs asynchronouslyReview and integrate locallyNowIssue-first + localRecord intent and decisionsImplement and verify in context
Figure 1: The workflow evolved with the cost of integration instead of staying tied to one tool

What I Built for Memolog

Memolog started as a static blog, but it now has the following architecture.

AreaMain components
WebAstro, MDX, React Islands, Azure Static Web Apps
APIAzure Functions Flex Consumption
DataAzure Table Storage, Private Endpoint
Multilingual supportAzure AI Translator, GitHub Actions OIDC authentication
MonitoringApplication Insights
Infrastructure as CodeBicep
Development managementGitHub Issues, pull requests, Actions, Copilot

The Azure environment had tenant-specific policies, including a prohibition on shared key authentication and disabled public network access. Instead of using typical samples as-is, I had to redesign the architecture around Managed Identity, Private Endpoint, and OIDC.

Discovering these constraints and deciding which architecture to adopt became a collaborative effort between Copilot and me.

Stage 1: From Concept to Implementation with Agent Mode

During the initial development, I told Agent Mode in VS Code that I wanted to proceed in this order:

  1. Document the architecture in docs
  2. Design the site
  3. Write the Phase 1 Bicep
  4. Scaffold the application

Based on those instructions, Copilot not only created the repository but also documented the reasoning in docs/architecture.md and docs/design.md. It then implemented the Astro pages, components, styles, and Bicep in the same flow.

At this stage, I was mainly responsible for:

Copilot’s role was to turn vague requests into documentation and code, then carry them through to an initial buildable state.

The strength of this approach was that the context connecting design and implementation remained intact. Decisions made in conversation could flow directly into documentation, code, and tests.

However, when decisions live only in a long conversation, it becomes difficult to trace later why an implementation took a particular shape. That led me to start using GitHub Issues as the unit of work.

Stage 2: Handing Implementation from Issues to Cloud Agent

For multilingual support, I first discussed the international SEO strategy with Agent Mode. Browser translation does not create actual English pages, which makes attracting traffic from English-language search difficult. I therefore chose to generate translated HTML under /en/.

I then broke the work into an Epic and individual Issues.

IssueScope
#4Epic for multilingual support and international SEO
#1Astro multilingual routing foundation
#2Translation pipeline using Azure AI Translator
#3Final SEO work, including hreflang, canonical URLs, and the sitemap

When I assigned the first Issue, #1, to Cloud Agent, it worked asynchronously and created a Draft Pull Request. I did not have to remain at my PC waiting for the implementation to finish, so I could work on something else in parallel.

Flow from a user-defined issue through cloud agent implementation, local Copilot review, and user acceptanceUserGoal and priorityIssueScope and done criteriaCloud agentCode and draft PRLocal CopilotDiff, tests, productionUserAccept, revise, or stopAsynchronous implementation still passed through a local quality gate before acceptance
Figure 2: The core workflow during the cloud-agent phase

The division of responsibilities during this period was clear.

Using Local Copilot as a Quality Gate

I did not merge a PR unchanged simply because Cloud Agent had created it.

In PR #11, which implemented the multilingual translation pipeline, the initial design used OIDC authentication from GitHub Actions to Azure. At the time, I could not create an App Registration in my tenant, so I concluded that the proposed architecture would not work as written.

I reviewed the diff with local Copilot and followed these steps:

  1. Check not only for code conflicts, but also for conflicts with the operating model
  2. Submit a Request Changes review on the PR
  3. Remove Azure authentication from CI and have the implementation changed to the local AAD authentication that was working at the time
  4. After the change, verify the local build and the generated English pages

Later, I confirmed that another system in the same tenant was successfully using OIDC with a User Assigned Managed Identity and a federated credential, so I revised my assumptions. Memolog now uses its own Managed Identity to run translation in GitHub Actions.

The important part was not clinging to the initial decision. When evidence from the actual environment disproved either Copilot’s answer or my understanding, I updated it.

When Parallel Work Produced the Same Fix Twice

Not every use of Cloud Agent went smoothly.

English article cards once appeared on the Japanese home page and linked to a nonexistent /blog/en/... path. I documented the cause and proposed fix in Issue #13, then assigned it to Cloud Agent.

However, another Issue, #15, was created for the same problem, which led to PR #14 and PR #16. Both added the same filter to the same two lines in src/pages/index.astro; the fixes were identical at the byte level.

I resolved the duplication as follows:

This experience showed me that parallel execution can reduce implementation time, but unclear work boundaries increase integration costs.

The problem was not Cloud Agent itself. It was insufficient coordination when defining the Issues. In a small, tightly coupled repository, dependencies and overlap between Issues need to be checked first so that multiple agents do not modify the same file or address the same defect.

Stage 3: Shifting to Local Implementation While Staying Issue-First

As the site gained features, a single fix increasingly required checking the Web app, API, Infrastructure as Code, GitHub Actions, and the production Azure environment.

For this kind of work, carrying forward the context of the current local conversation and the latest validation results can be faster. I now keep the rule of creating an Issue first, while doing more of the implementation with local Copilot.

The repository’s .github/copilot-instructions.md currently defines these rules:

Current issue-first workflow from user decision through issue creation, local implementation, verification, and recording resultsChoose directionUserCreate issueRecord intentImplementLocal CopilotVerifyTests, CI, productionRecord resultsIssue, PR, chatKeep both conversational speed and a durable trail of decisions
Figure 3: The current issue-first local implementation workflow

This approach preserves the speed of moving directly from conversation to implementation and validation, while making the purpose and results traceable later through the Issue.

How GitHub Copilot and I Divide Responsibilities

This is how the responsibilities are divided today.

WorkMeGitHub Copilot
PurposeDecide what to accomplish and who it is forStructure the purpose into requirements and tasks
PrioritiesDecide what to do now, later, or not at allPropose dependencies and implementation order
ArchitectureDecide what to adopt based on cost, security, and operational constraintsResearch and compare options, official information, and the existing implementation
ImplementationDefine expected behavior and acceptable boundariesChange code, tests, IaC, and documentation
ReviewDecide whether to accept a risk and whether the experience is good enoughDetect problematic diffs, regressions, security issues, and missing tests
ValidationDecide whether to deploy to production and whether the problem is solvedCheck builds, tests, CI, HTTP responses, and logs
RecordkeepingChoose which decisions need to be preservedOrganize Issues and documentation so the work can be reproduced
Final accountabilityApprove merges, publication, and Azure changesReport results and uncertainty

In particular, I do not give up these four responsibilities:

  1. Purpose: Being technically possible does not make something worth building.
  2. Accepting constraints: A person must decide how much cost, security risk, privacy impact, and operational burden is acceptable.
  3. Adoption decisions: Copilot’s proposals are options, not decisions.
  4. Production accountability: I remain responsible for the final decision to publish or deploy.

Conversely, I actively delegate tasks that suit Copilot: finding relevant areas in a broad codebase, narrowing hypotheses through tests, and repeating the same checks precisely.

What the Execution Logs Showed

For this retrospective, I compared session logs with GitHub records rather than relying only on memory. These were some of the representative events.

DateRecorded request or decisionConfirmed result
2026-07-13Proceed with documentation, design, Phase 1 Bicep, and scaffolding in that orderCreated architecture documents, the Astro site, Bicep, and the initial build
2026-07-13Break multilingual support into Issues and assign #1 to Cloud AgentReviewed PR #5 locally and confirmed a build that included the English routes
2026-07-13The authentication design in PR #11 did not fit the tenant constraintsSubmitted Request Changes and validated again after the design was revised
2026-07-14Review PR #14 and PR #16 togetherConfirmed that the fixes were identical, merged one, and closed the other as a duplicate
2026-07-20Revisit the OIDC assumptions using evidence from the actual environmentBuilt CI translation with Managed Identity and confirmed the English articles in production
2026-07-31Write this articleCreated Issue #117 and drafted the article locally after cross-checking execution logs, Issues, and PRs

The logs showed me that developing with Copilot is not about receiving the correct answer once. It is a process of implementing a hypothesis, testing it in the real environment, and updating both the implementation and the record when it is wrong.

When I Still Want to Use Cloud Agent

Local implementation is now my default, but I have not stopped using Cloud Agent. I still expect it to be useful when:

By contrast, work that depends heavily on the latest local validation, incident response spanning multiple layers, or changes concentrated in the same files is easier to handle continuously with local Copilot.

The important question is not whether Agent Mode or Cloud Agent is better. It is which one fits the work’s independence, wait time, and integration cost.

Summary

As I built Memolog, the way GitHub Copilot and I divided the work gradually changed.

Copilot did more than increase the speed of writing code. It accelerated the entire loop across research, design, implementation, testing, production verification, and recordkeeping.

However, deciding what to build, what to trust, which risks to accept, and when to release to production remains my responsibility. Keeping that boundary in mind is what makes Copilot a development partner rather than merely a code generator.