Software Design Reference Capstone · Weak packet

Capstone · Weak packet

The Same Initiative, Done Weakly

Nothing below is stupid. Every page is the kind of page a capable senior engineer writes on a Tuesday, and most of it would be approved without comment. That is exactly what makes it worth studying.

Read this the way a reviewer would: not asking “is it wrong?” but “what decision could I make from this, and what would I still have to guess?” Then read the reviewer notes, which put each artifact beside its strong counterpart.

What you are reading. This is a fictional packet for the same returns-resolution initiative, written as a competent-but-junior initiative lead would write it: complete-looking, professionally worded, internally plausible, and unable to survive contact with evidence. It is not a parody. The failure modes here — output framed as outcome, assumption stated as fact, one option presented as a decision, a review that reports activity — are the common ones, and they are common precisely because the resulting documents look fine.
Contents

1 Initiative frame · 2 Assumptions · 3 Workflow · 4 Backlog · 5 Acceptance criteria · 6 Non-functional requirements · 7 Architecture · 8 Data model and API · 9 Technical decision · 10 Delivery plan · 11 Ways of working · 12 Test and release plan · 13 Weekly status · 14 Launch summary

1 · Initiative frame

Returns Portal — Project Brief v1.0 (final)
Background
Customers are unhappy with our returns process and support is overloaded. Competitors offer self-service returns and we are behind.
Vision
Deliver a best-in-class, frictionless self-serve returns experience that delights customers and reduces support load.
Goals
  • Launch the self-serve returns portal by the end of Q3.
  • Automate return approvals so customers do not wait for an agent.
  • Integrate carrier label generation and status notifications.
  • Reduce support tickets significantly.
  • Improve customer satisfaction.
Success criteria
  • Portal launched and available to all customers.
  • 90%+ of returns approved automatically.
  • Support tickets down.
  • Positive customer feedback.
  • No P1 incidents in the first month.
Scope
Returns request, eligibility check, carrier label, status tracking, email notifications. Admin view for support agents.
Out of scope
Anything not listed above.
Timeline
10 weeks. Launch 30 September.
Stakeholders
Product, Engineering, Design, Support, Finance, Legal.
Assumptions and risks
See section 2.

The brief was reviewed at the kickoff on 24 August and signed off by the steering group. It is version 1.0 and is expected to be stable; changes go through the change-request process.

2 · Assumptions and risks

Assumptions
Risk register
RiskLikelihoodImpactMitigation
Carrier API integration takes longer than expectedMediumMediumStart integration early
Scope creepHighMediumChange-request process
Dependency on platform team for credentialsMediumLowRaise early
Team capacity over the summer holidaysMediumMediumPlan around leave
Performance under loadLowHighLoad test before launch

The assumptions were validated with stakeholders at kickoff. Support confirmed that most returns follow standard policy, and the warehouse team confirmed the carrier API works well for them. No further validation is planned; the team will find out during development.

3 · Returns workflow

The new returns flow is straightforward and was agreed with product and support in the kickoff workshop.

Returns flow (to-be)
  1. Customer logs in and selects an order to return.
  2. System checks eligibility against the returns policy.
  3. If eligible, the system approves the return and generates a carrier label.
  4. Customer receives the label by email and ships the item.
  5. Warehouse receives and inspects the item.
  6. Refund is issued to the original payment method.
  7. Customer receives a confirmation email.

If the return is not eligible, the customer sees an error message and can contact support. The current process is well understood by the team — it is essentially the same flow with an agent doing steps 2 and 3 manually — so it has not been documented separately.

Domain entities: Return, ReturnItem, Order, Customer, Label, Refund, ReturnStatus.

4 · Backlog

The work has been broken down into user stories and estimated in story points. Everything above the line is MVP for the 30 September launch.

Product backlog · sprint-ready
#StoryAreaPoints
RET-1Create returns database schema and modelsBackend5
RET-2Create Return API endpoints (CRUD)Backend8
RET-3Implement eligibility rules engineBackend13
RET-4Integrate with order platformIntegration8
RET-5Integrate with carrier API for labelsIntegration13
RET-6Integrate with payments for refundsIntegration8
RET-7Consume warehouse receipt eventsIntegration5
RET-8Build returns request screenFrontend8
RET-9Build status tracking screenFrontend5
RET-10Build agent admin screenFrontend8
RET-11Email notification templatesFrontend3
RET-12Authentication and authorizationBackend5
RET-13Set up monitoring and dashboardsPlatform3
RET-14Load testingPlatform3
RET-15Accessibility reviewFrontend3
RET-16Documentation and runbookPlatform2
— MVP line —
RET-17Exchanges instead of refundsBackend13
RET-18Guest checkout returnsBackend8
RET-19International returnsIntegration13
RET-20SMS notificationsIntegration5

Total above the line: 91 points. At a velocity of around 20 points per sprint, that is five sprints, which fits the 10-week timeline.

5 · Acceptance criteria

RET-3 · Implement eligibility rules engine

As a customer I want my return request to be approved automatically so that I do not have to wait for support.

Acceptance criteria

RET-5 · Integrate with carrier API for labels

As a customer I want a shipping label so that I can send my item back.

Acceptance criteria

Further acceptance criteria are captured on the individual tickets and refined in sprint planning. Edge cases will be raised by QA during testing.

6 · Non-functional requirements

NFRs
RequirementTarget
ScalabilityThe system must be scalable to handle future growth.
PerformancePages should load quickly; API responses should be fast.
Availability99.9% uptime.
SecurityThe system must be secure. Follow company security standards and OWASP Top 10.
MaintainabilityCode must be clean, well tested, and easy to change.
ReliabilityThe system must be reliable and handle errors gracefully.
ObservabilityAll services must emit logs and metrics.
AccessibilityMeet accessibility standards.
ComplianceComply with data protection requirements.

These are the standard NFRs for customer-facing systems in our estate and were agreed with the architecture group.

7 · Architecture

The architecture follows our standard patterns: a React frontend, a Python service layer, and managed infrastructure. It is designed to be scalable and cloud-native.

C4 — Container diagram
ComponentTechnology
FrontendReact 18, TypeScript, Vite
APIFastAPI, Python 3.12
DatabasePostgreSQL 16
CacheRedis
QueueRabbitMQ + Celery
Object storageS3 (label PDFs)
RuntimeKubernetes, 3 replicas, HPA
CI/CDGitHub Actions → ArgoCD
MonitoringDatadog, Sentry
AuthExisting SSO / session service
C4 — Context

The Returns Service talks to:

   [ Frontend ] --> [ Returns API ] --> [ Postgres ]
                          |
                          +--> [ Order Service ]
                          +--> [ Carrier API ]
                          +--> [ Payment Service ]
                          +--> [ Redis ]
                          +--> [ RabbitMQ ] --> [ Celery worker ]
  

Sequence diagrams for the main flows will be added to the wiki during implementation. The service is deployed as its own microservice so it can be scaled and released independently of the storefront, in line with our microservices strategy.

8 · Data model and API

Returns table
ColumnTypeNotes
iduuidPK
order_iduuidFK to order platform
customer_iduuid
statusvarcharpending / approved / rejected / shipped / received / refunded
reasontextfree text from the customer
label_urltextnullable
refund_amountnumericnullable
created_at / updated_attimestamptz
API
MethodPathPurpose
POST/api/v1/returnsCreate a return
GET/api/v1/returns/{id}Get a return
GET/api/v1/returnsList the customer's returns
PATCH/api/v1/returns/{id}Update a return (status, agent notes)
POST/api/v1/returns/{id}/labelGenerate the label
POST/api/v1/webhooks/warehouseReceive receipt events

Standard REST conventions. Errors use standard HTTP status codes with a JSON body. Versioned under /v1; breaking changes will go to /v2. Clients should be tolerant readers and ignore fields they do not recognise, so adding fields is safe.

Status transitions are enforced in the service layer. Refunds are triggered when the status becomes received. Retries are handled by Celery's built-in retry mechanism.

9 · Technical decision

ADR-001 · Asynchronous processing for carrier label generation
Status
Accepted
Context
Calling the carrier API synchronously inside the request could make the request slow if the carrier is slow. We want the API to stay responsive.
Decision
We will generate labels asynchronously using RabbitMQ and Celery. When a return is approved, a task is queued; the worker calls the carrier API and updates the return with the label URL. Celery's retry mechanism handles transient failures.
Rationale
RabbitMQ and Celery are already part of our standard stack, the team knows them well, and this is the established pattern for background work in our platform. It decouples the request from the carrier and lets us scale workers independently.
Consequences
Labels are not available immediately; the frontend will poll the status endpoint. We will need to monitor the queue.

Other decisions (framework choice, database, deployment target) follow existing platform standards and did not require an ADR.

10 · Delivery plan

Sprint plan · 5 sprints × 2 weeks
SprintFocusStories
1Foundations: schema, models, project setup, authRET-1, RET-2, RET-12
2Core backend: eligibility rules, order integrationRET-3, RET-4
3Integrations: carrier, payments, warehouse eventsRET-5, RET-6, RET-7
4Frontend: request, status and admin screens, emailsRET-8, RET-9, RET-10, RET-11
5Hardening: monitoring, load test, accessibility, docs, UATRET-13 – RET-16
Dependencies

Estimated completion: 5 sprints from 24 August, ending 30 September. The plan is achievable with the current team. Buffer for unknowns is built into the hardening sprint.

11 · Ways of working

Team and process

The team is collaborative and everyone is encouraged to contribute to any decision. Escalation is to the engineering manager if needed.

12 · Test and release plan

Test plan
Monitoring
Release plan

13 · Weekly status

Returns Portal · weekly status · week 3 (11 September)
Status
Green — on track for 30 September.
Progress this week
  • Sprint 2 completed: 22 of 24 points delivered (velocity 22).
  • Eligibility rules engine implemented and unit tested.
  • Order platform integration complete.
  • Carrier integration started — approximately 80% complete.
  • Database schema finalised and migrated on staging.
  • 12 tickets closed, 3 in progress, 1 blocked.
  • Design handed over the status page and admin screens.
Next week
Finish carrier integration, start payments and warehouse events, begin frontend work.
Risks and issues
  • The carrier sandbox is slower than expected. The team is investigating and will optimise if needed.
  • Still waiting on the payments team for refund API access. Chased again this week.
  • Support mentioned that a lot of returns are actually gift orders. Noted for later.
Blockers
None that will affect the date.
Metrics
Velocity 22. Burn-down on track. Test coverage 84%. Zero open P1 bugs.
Asks
None.

Sprint 3 will absorb the remaining carrier work. The team is confident that the 30 September date holds.

14 · Launch summary

Returns Portal · launch summary
Status
Launched on 29 September, one day ahead of plan. All MVP stories delivered.
What shipped
Self-serve returns portal with automated eligibility, carrier label generation, status tracking, email notifications, and an agent admin screen.
Results
  • Portal is live for 100% of customers.
  • Most returns are now approved automatically.
  • Support has reported a noticeable drop in returns-related tickets.
  • No P1 incidents in the first two weeks.
  • Positive feedback from the support team and from the steering group.
Retrospective
  • What went well: strong team collaboration; hit the date; good test coverage; the async label design worked.
  • What could be better: the carrier integration took longer than estimated; requirements changed mid-project; too many meetings.
  • Actions: estimate integrations more conservatively; tighten the change-request process.
Next steps
Phase 2: exchanges, guest checkout, international returns, SMS notifications. Backlog already groomed (RET-17 to RET-20). The team rolls straight onto phase 2 in October.
Thanks
Great effort from everyone involved.

The feature flag remains in place for safety. Monitoring is on the existing platform dashboard. Documentation is in Confluence.

Before you read the reviewer notes
  1. Write down the three sentences in this packet you would have accepted without question a year ago.
  2. For each of the fourteen sections: what decision could a reader actually make from it, and what would they still have to guess?
  3. Which single change to this packet would improve it most — and which artifact would that change force you to rewrite next?

Now read the reviewer notes, which put each section beside its strong counterpart and name the rubric dimension the difference touches.