Sequence numbers are currently not enforceable by Bitcoin. If two transactions spend the same outputs, then the miner is supposed to pick the transaction (input) with the higher sequence number. This cannot be enforced and so, the miner would probably pick the one with the highest fees.
They could be enforced, if transaction replacement was possible in blocks. With a hard fork, the rule could change so that transactions with locktimes in the future are allowed into the blocks. The locktime would prevent the outputs from being spent. Afterwards, if someone broadcasts a transaction which double spends some of the inputs and where all those inputs have a higher sequence number, then it would effectively cancel the original transaction. Once the locktime is reached, then the outputs of the highest sequence transaction could be spent.
It is possible to do this (less efficiently) with a soft fork.
The anchor/multisig transaction would have N outputs of the following form:
IF
<now + 40 days> CLTV DROP <refund public key> OP_CHECKSIG
ELSE
<N> <N public keys> <N> CHECKMULTISIGVERIFY
END
The state update transactions would be N input and N output transactions with the following outputs.
IF
<now + 30 days> CLTV DROP <new owner's public key> OP_CHECKSIG
ELSE
<sequence_number> OP_CHECKSEQUENCEVERIFY
END
They would spends the first N outputs of the anchor transaction and spend them to N new outputs. Each of the state update transactions can act as a link. As long as it is spending a link with a lower sequence number, then it is a valid transaction. Once the 30 day CLTV passed, the result output can be spent.
There needs to be an allowance for at some extra inputs into the transaction, in order to pay fees. This could work similar to SIGHASH_ANYONE_CAN_PAY.
OP_CHECKSEQUENCEVERIFY means that you can effectively use the parent transaction's scriptPubKeys instead of this transaction's. Each lower sequence number transaction uses the public key from its parent in a chain back to the root/anchor transaction.
In psuedo-code, it does the following
Note: max_sequence starts at 0xFFFFFFFF
if (sequence_number >= max_sequence)
return FAIL;
If (txid of first N inputs aren't equal)
return FAIL;
parent = getTransaction(TxIn[n].getPrevTransaction())
if (txid of first N inputs of parent aren't equal)
return FAIL;
stack.pop(); // remove <sequence number>
stack.pop(); // remove <1> for IF
subScript.max_sequence = sequence_number
subScript.scriptSig = stack.copy()
subScript.scriptPubKey =parent.getgetPubKey()
transactionCopy = transaction with first N txids replaced with grandparents txid
if (subScript.execute(transactionCopy) == FAIL) // Use transactionCopy for all scriptSig operations
return FAIL;
proceed as if it was a NOP