Five people, three codebases, two weeks. This page is the deliverable the qualification exercise asks for under “documentation of the team structure, roles, and responsibilities” and “an overview of any AI-assisted coding tools used and how they contributed”.
Roles & responsibilities
| Person | Role | Responsibilities |
|---|---|---|
| Oleksandr Andriichuk | Team Lead | Scope and delivery ownership, team organisation, task breakdown and assignment, cross-repo decisions, client-facing communication and the documentation set (this site included) |
| Abddukodir Gofurboyev | Senior Backend Developer | Backend development and system architecture: the NestJS services, the money path (payments → pricing → accrual → claim → attestation → relay → settlement), the data model and its invariants, deployment |
| Uladzislau Popou | Senior React Native Developer | Mobile development and mobile architecture: the WDK worklet integration, wallet lifecycle, session lock and biometrics, the store/API layering |
| Siamon Krapivin | Senior React Native Developer | Mobile development and mobile architecture: payment flows (scan, send, approve), the asset registry and balances, the rewards and claim screens, UI system |
| Mikita Yakunin | QA Engineer |
Test planning and manual verification across all three
codebases: the end-to-end money path on testnet, mobile
regression passes (wallet lifecycle, scan/send/approve, claim),
release checks before each main deploy, and bug
reports on the project board
|
Both React Native engineers are senior and share architectural
ownership of the app rather than splitting it into “features” and
“plumbing”. The split above is where each spent most of their time,
not a fence — every non-trivial mobile decision (the
app → screens → shared import rule, the single
RootStore, gas-mode fallback, the ERC-1271 claim
signature) was made by the two of them together.
AI tooling
Two tools, used deliberately and for different jobs. Neither was allowed to merge anything on its own: every line landed through a human-reviewed pull request, and the test suites (590 backend tests, 119 contract tests) are the gate that made that review affordable.
| Tool | Used as | What it actually contributed |
|---|---|---|
| Claude | development and design tool | Architecture exploration before code (process split, trust boundaries, the claim state machine), implementation of well-specified modules, test generation, security review of the money path, and this documentation set |
| Cursor | agentic IDE |
In-repo, multi-file execution of agreed changes: refactors
across a module, wiring a screen to an endpoint, keeping
AGENTS.md/CLAUDE.md conventions
applied consistently while editing
|
The conventions files in each repo (backend/CLAUDE.md,
mobile/AGENTS.md) exist for this reason: they are the
brief both tools read, so generated code arrives already shaped like
the code around it — kebab-case files, E-prefixed enums
and centralised error codes on the backend, single-line comments,
named observer() components and the
app → screens → shared import rule on mobile.
One convention worth calling out: mobile reviews leave
AI-REVIEW: comments inline and the answer goes directly
below as AI-ANSWER:, with the original question never
removed. The reasoning behind a decision stays next to the code that
embodies it instead of dying in a pull-request thread.
Delivery method
Two weeks, five people, three repositories — short enough that a sprint-based process would have spent more of the window on ceremony than on delivery. We ran continuous-flow Kanban on a GitHub Projects board, with the pieces of Scrum that pay for themselves at this length kept and the rest dropped: a single prioritised backlog, one owner per item, an explicit definition of done, a work-in-progress limit, and a written record of every decision.
| Practice | How we applied it |
|---|---|
| Board as the single source of truth |
Columns are Backlog → Ready → In progress → In review →
Done. Nothing is worked on that is not an issue on the
board, so status is read off the board instead of asked for
|
| One owner, WIP limit of one | Every issue has exactly one assignee, and an engineer takes a second item only when the first is in review. Parallel half-finished work across three repositories is the failure mode we were most exposed to |
| Vertical slices, not layers |
Work is cut so each issue lands something demonstrable end to
end — "claim a coupon on Sepolia", not "write the claim
service". Cross-repo slices carry the contract (the
paymentRef derivation, the EIP-712 domain) as
part of the same issue
|
| Definition of done |
Merged into develop, reviewed by someone who did
not write it, tests and coverage gate green in CI, and the
documentation page for that area updated in the same pull
request. An issue is closed by the pull request, not by hand
|
| Clear decision ownership | The team lead owns scope, priority and all client-facing communication — one voice outward. Technical decisions inside an area belong to that area's owner; anything crossing two repositories needs both owners to agree, in writing |
| Risk register instead of end-of-project surprises | Known defects and accepted trade-offs were tracked as they were found, with severity and cause, and handed over as the Known gaps page rather than discovered during review |
Cadences
Async-first: written by default, synchronous only where a call is genuinely cheaper than a thread.
| Cadence | When | Purpose & output |
|---|---|---|
| Daily written check-in | Every working day, async | Three lines per person — shipped, next, blocked — posted in writing rather than gathered in a meeting. The board is updated before the check-in, so the check-in only carries what the board cannot show: blockers and intent |
| Cross-repo sync | Twice a week, ~30 min |
The one call worth having with three repositories in flight:
the shared contracts — REST shapes, the EIP-712 domain,
paymentRef, deployed addresses. Output is a
written decision and, where it needs one, a shared fixture
|
| End-of-week demo & re-plan | Weekly | Working software on a device against the deployed backend, not slides. The demo sets the next week's priorities, so scope was re-cut twice inside the window rather than defended to the end |
| Retrospective | End of delivery | What we would keep and what we would change — written up as the Lessons learned and Next steps pages instead of staying in a call |
Response times we held ourselves to
Not meetings — targets. A cadence says when we talk; these say how long something is allowed to sit. On a board with a work-in-progress limit, waiting is the expensive part.
| Commitment | Target | Why it is the number that matters |
|---|---|---|
| Blocker escalation | Same day, no waiting | A blocked item is flagged on the board and raised to the team lead immediately rather than saved for the next check-in. Anything needing the client or the WDK team leaves as an email the same day, because their clock starts when ours stops |
| Pull-request review turnaround | Within one working day | Review latency is what stalls a WIP-limited board: with one item each, a review sitting for two days stops two engineers, not one. Cross-repo changes need both owners; CI gates the branch and nothing merges red |
Channels
| Channel | Used for |
|---|---|
| Gmail | The written record: daily check-ins, scope questions and decisions, and the support thread with the WDK team. Anything that changes scope or a shared contract ends up here, so a decision can be re-read months later |
| GitHub Project Issues | Task distribution and management: every unit of work is an issue on the project board, assigned to one person, moved across columns, and closed by the pull request that implements it |
| GitHub pull requests |
Code review — every change is reviewed by someone who did not
write it, and a change to anything two repos share (the
paymentRef derivation, the EIP-712 domain, the
REST shapes) needs the owners of both sides. CI gates the
branch; nothing merges red
|
Branching follows the deployment: work branches into
develop, develop into main, and
Dokploy deploys main. CI does not deploy — it gates, so a
red pipeline never reaches the branch the deployment watches. The full
pipeline is on the Operations
page.