Reported September 2026
Plaidgraph

Validate and Resolve Evaluation Chains

Reported by candidates from Plaid's online assessment. Pattern, common pitfall, and the honest play if you blank under the timer.

Get StealthCoderRuns invisibly during the live Plaid OA. Under 2s to a working solution.
Founder's read

Plaid's September 2026 OA hands you a pile of [evaluation, target] rows and asks if they all resolve to true or false. Strip the story and it's a functional graph: every node has one outgoing edge, and you chase it to a terminal literal. The traps are duplicates, undefined references, and cycles, any of which kills the whole input. With up to 10^5 rows, a naive chase per node won't survive. If you blank mid-assessment, StealthCoder runs invisibly as a safety net while you work. Know the shape first and the code is short.

The problem

Each row of links is [evaluation, target]. A target is either another evaluation name or the literal true or false. Evaluation names are case-sensitive; the two literals are case-insensitive.
Every evaluation must eventually reach one Boolean literal. A duplicate definition, a reference to an undefined evaluation, or a cycle makes the complete input invalid; return ["INVALID"].
Otherwise, return one name:value string for every evaluation, sorted by name.

Function
evaluateChains(links: String[][]) → String[]

Examples
Example 1
links = [["E1","E2"],["E2","true"],["E5","false"]]
return = ["E1:true","E2:true","E5:false"]
E1 follows E2 to true, while E5 is an independent false chain.
Example 2
links = [["A","B"],["B","A"]]
return = ["INVALID"]
A and B form a cycle.
Example 3
links = [["check","missing"]]
return = ["INVALID"]
The referenced evaluation has no definition.

Constraints
1 <= links.length <= 10^5.
Names are non-empty ASCII alphanumeric strings and are never the reserved literals.

Reported by candidates. Source: FastPrep

Pattern and pitfall

Build a hash map from name to target. If a name shows up twice, return INVALID right away. Then resolve each node with memoized iterative traversal. Lowercase the target and check if it's "true" or "false". Names stay case-sensitive, so never lowercase them. Walk from a node, tracking the current path in a set or with a three-state marker (unvisited, visiting, done). If you hit a visiting node, that's a cycle. If the target isn't in the map and isn't a literal, that's undefined. When you reach a literal or a done node, write the value back to every node on the path. Use iteration, not recursion, because a chain of 10^5 will blow the stack in many languages. Finally sort names and format name:value. The common pitfall is checking validity lazily and returning partial output. Validate everything before you output.

Drill it cold or hedge it with StealthCoder. Either way, don't walk into the OA hoping you remember the trick.

If this hits your live OA

You can drill Validate and Resolve Evaluation Chains cold, or you can hedge it. StealthCoder runs invisibly during screen share and surfaces a working solution in under 2 seconds. The proctor sees the IDE. They don't see what's behind it. Made for the candidate who got the OA invite this morning and has 72 hours, not six months.

Get StealthCoder

Related leaked OAs

⏵ The honest play

You've seen the question. Make sure you actually pass Plaid's OA.

Plaid reuses patterns across OAs. Made for the candidate who got the OA invite this morning and has 72 hours, not six months. Works on HackerRank, CodeSignal, CoderPad, and Karat.

Validate and Resolve Evaluation Chains FAQ

What's the real trick in Plaid's evaluation chains problem?+

Every node has exactly one outgoing edge, so it's a functional graph. Resolve each node by following the chain, detect cycles with a visiting state, and memoize results so each node is processed once. That gives linear time overall, which matters at 10^5 rows.

How do I handle the case-sensitivity rules?+

Compare targets to the literals using a lowercased copy only for the true/false check. Keep evaluation names exactly as given, so "A" and "a" are different nodes. Since names are never reserved literals, there's no ambiguity about whether a target is a name or a literal.

Should I use recursion or iteration?+

Iteration. A single chain can be 10^5 long, which can overflow the call stack in Python or Java. Walk with a loop, push nodes onto a path list, then back-fill the resolved value for every node on that path once you hit a literal or a resolved node.

What counts as INVALID and when do I return it?+

Any duplicate definition, any target that's neither a defined name nor a literal, or any cycle. One bad row invalidates the whole input, so don't return partial results. Check duplicates while building the map, then check undefined and cycles during resolution, and return ["INVALID"] immediately.

How do I prepare for this in 48 hours?+

Practice cycle detection in a functional graph with three-state marking, and memoized path compression. Write the solution once end to end, including the sort and name:value formatting. Test the three examples plus a self-loop like ["A","A"] and a duplicate row. That covers most of the failure modes.

Problem reported by candidates from a real Online Assessment. Sourced from a publicly-available candidate-aggregated repository. Not affiliated with Plaid.

OA at Plaid?
Invisible during screen share
Get it