Engineer
What arrives in your queue is more complete than before. Your accountability for quality is unchanged.
What Changes, What Doesn't
What changes is what arrives. Work that enters your queue from a ProductHarness-enabled team comes with structured requirements, connected design context, and test cases already linked to acceptance criteria. The ambiguity that typically requires three conversations before a ticket is actionable has been reduced before it reaches you. Patterns your team has established are encoded in the repo context — generated code applies them by default.
What doesn't change: your accountability for the implementation being correct. Generated code is a starting point, not a finished product. Architecture decisions, production edge cases, performance implications, security patterns — these belong to engineering judgment. No agent substitutes for that. The harness works best when engineers participate in defining the standards it steers from — your expertise is what makes the steering documents accurate.
There is a cultural dimension here worth naming directly. ProductHarness works best when engineering teams treat the framework as a collaborative tool, not an externally imposed constraint. The engineers who get the most value are the ones who contribute to the standards — who treat pattern mismatches as feedback opportunities, not friction sources.
Engineering Workflow
The MR arrives with requirements context, linked acceptance criteria, design references, and generated code. Start with the requirements — not the diff. Understand what was intended before evaluating whether the implementation achieves it.
The MR from a design repo sync contains: component files, Storybook stories, Playwright test files with test management case keys, and a description of what was validated before sync. What's intentionally missing: API integration (the component uses static mock data), error boundaries beyond the acceptance criteria, and feature flag wrapping. This is normal — the component is a validated shell that you complete with production logic.
You add: The judgment call about whether the approach is sound. Does the architecture make sense? Are there production considerations the requirements don't address?
Use the agent to load the relevant repo context — the requirements, the design context, the production patterns — before diving into implementation. The agent can summarize what's been specified and what the production codebase conventions expect.
"Summarize the requirements and acceptance criteria for [feature] from the repo."
"What production patterns from the codebase are relevant to implementing [feature]?"
"What edge cases in the requirements are likely to require engineering judgment?"
"Pull the context for [story key] and show me the existing API patterns in src/api/[area]"
The scaffolded component handles presentation. You add three categories of production-specific pieces that the design repo couldn't supply.
API Integration
The component arrives with static props. Connect it to your data layer using your team's established patterns. If the team uses React Query hooks, for example, the pattern looks like this — generalized from your codebase's conventions:
// The component from the design repo — static props
export const UserProfileCard: React.FC<UserProfileCardProps> = ({ name, avatarUrl, role }) => {
// ... presentation code — validated in Storybook
};
// Your addition — connected to your data layer
import { useUserProfile } from '@/hooks/useUserProfile';
export const UserProfileCardContainer: React.FC<{ userId: string }> = ({ userId }) => {
const { data: profile, isLoading, error } = useUserProfile(userId);
if (isLoading) return <UserProfileCardSkeleton />;
if (error) return <UserProfileCardError error={error} />;
return <UserProfileCard {...profile} />;
};
Error Handling
Add error boundaries and fallback states that the design repo couldn't anticipate — states that depend on real API behavior, missing data, or network conditions. The design validated what the happy path looks like; you add the handling for everything else. An empty-state check, a null guard, an error boundary — these belong to you.
Feature Flag Wrapping
If the component is landing before the full feature is ready for all users, wrap it with your team's feature flag system:
import { useFeatureFlag } from '@/hooks/useFeatureFlag';
export const UserProfileCardGated: React.FC<UserProfileCardContainerProps> = (props) => {
const isEnabled = useFeatureFlag('user-profile-card-v2');
if (!isEnabled) return null;
return <UserProfileCardContainer {...props} />;
};
You add: Production readiness. The generated code is shaped by the repo context, but your judgment about what "production-ready" means for this specific feature and codebase is irreplaceable.
The .spec.ts file from the design repo tests the component against Storybook. In production, you have three options — choose based on your team's setup and the role Storybook plays in your production pipeline.
Option A — Keep Storybook tests, add production tests separately. If your production repo also runs Storybook, the synced .spec.ts can continue to work as-is. Add a separate test file for the container component that tests the API integration path. The original tests validate presentation; the new tests validate behavior with real data patterns.
Option B — Adapt the base URL. Replace the Storybook URL in the test with your staging app URL. The test navigates to the actual feature in the application rather than the isolated Storybook story:
// Design repo version — navigates to Storybook story
await page.goto('http://localhost:6006/?path=/story/userprofilecard--default');
// Production version — navigates to the feature in the app
await page.goto(`${process.env.APP_URL}/settings/profile`);
Option C — Use the page object pattern. Abstract the navigation so the same test logic works in both environments. The page object handles "how to get to this component" and the test handles "what to verify." This is the most maintainable approach when the same tests need to run in CI against both Storybook and the production app.
The test case keys (PROJ-TC-XXX) in the test titles are preserved regardless of which option you choose. Results continue flowing to the same test management cases — the traceability chain from acceptance criteria through to production test results remains unbroken.
You add: Test architecture judgment. Which tests should be unit vs. integration vs. e2e? What coverage is actually meaningful here?
Run the full CI pipeline. If your org's technical standards are encoded in the repo, CI gates reflect those standards — lint, type-check, test coverage thresholds, security scans. Passing CI is not just a green check; it's verification that the implementation meets the org's encoded standards.
Deploy to staging and validate behavior against the acceptance criteria. This is the engineering equivalent of the designer's Storybook check — confirming that what was built in the implementation environment behaves correctly in the production-like environment, with real data and real dependencies.
What You Receive vs. What You Add
| What the harness produces | Where engineering judgment takes over |
|---|---|
| Structured requirements with acceptance criteria | Architecture decisions not captured in requirements |
| Connected design context with production pattern awareness | Production edge cases the design doesn't address |
| Generated code shaped by repo conventions | Adaptation where generated code diverges from production reality |
| Test case stubs linked to acceptance criteria | Test architecture, coverage balance, production test data |
| Encoded technical standards for common decisions | Novel architectural decisions not yet encoded in standards |
| Version-controlled requirements and decision history | Implementation judgment calls that go beyond the spec |
| Presentational component with all visual states | API integration, error handling, feature flags, analytics |
Context, Patterns, and Mismatches
The agent's outputs are shaped by the context it has. When that context is accurate — when the steering documents reflect how the org actually builds software — generated code is production-realistic from the start. When the context is stale or incomplete, gaps show up in the output.
Loading repo context: Give the agent explicit context about what you're working on. "I'm implementing [feature]. The relevant requirements are in [location]. The related production patterns are [relevant area of the codebase]." The more specific the context, the more accurate the output.
"Load the requirements for [feature] and summarize what needs to be implemented."
"Given the production auth patterns in [codebase area], how should [feature] handle authentication?"
"The generated code uses [pattern X]. Our production convention is [pattern Y]. Update to match."
Pattern mismatch guidance: When generated code doesn't match production patterns, the right response is not to accept the deviation — it's to identify the gap and feed it back into the steering documents. A pattern mismatch is a signal that the technical standards aren't fully encoded yet. Fix it once in the standards; it won't recur in future generations.
The practical process: identify the gap precisely ("the generated code uses [X], but we use [Y] because [reason]"), apply the correction to the current work, and propose updating the relevant technical standard document so the correction applies automatically going forward. This is how the harness gets better over time — engineering feedback improves the standards that shape the agent's outputs.
From Merge Request to Production
Here's the complete engineering flow for a synced component — from receiving the MR to deploying to production. The component is a User Profile Card that displays a user's name, avatar, and role.
Engineer: Receives MR "design-sync/user-profile-card" in production repo.
Files: UserProfileCard.tsx, UserProfileCard.module.scss,
UserProfileCard.stories.tsx, UserProfileCard.spec.ts
Engineer: Reviews the component. Presentation looks correct.
SCSS tokens map to production tokens. TypeScript types are clean.
Missing (expected): API integration, error handling, feature flag.
Engineer: (in coding agent) "Pull the context for PROJ-456 and show me
the existing data-fetching patterns in src/api/users/"
Agent: Fetches the backlog story, reads the API files.
"The users API uses React Query hooks. Here's the pattern
from useUserProfile.ts — looks like you'll want to follow
the same data/isLoading/error destructuring pattern."
Engineer: Creates UserProfileCardContainer with useUserProfile hook.
Adds error boundary, empty-state fallback, and feature flag
wrapping behind 'user-profile-card-v2'.
Engineer: Adapts UserProfileCard.spec.ts Option B — replaces Storybook URL
with APP_URL/settings/profile for the container integration test.
Adds a test case for the empty-state (no avatar URL).
Engineer: Pushes. CI passes (lint, typecheck, tests, build).
Deploys to staging. Playwright tests pass against staging URL.
Test management shows PROJ-TC-201 through TC-206 all green.
Engineer: Submits change request through org's change management process.
Deploys to production behind feature flag.
Updates sync-manifest.json status to "synced".
Sends brief Slack message to design team: component is live.
Time spent writing boilerplate component code from scratch: zero.
Time spent interpreting Figma specs: zero.
Engineer effort focused on: the production-specific pieces that
require codebase knowledge and engineering judgment.