# signed-effect-input

> Review ordinary state or shielded input coin sources absent from enforced signature message dependencies.

Canonical: https://nightshade.dicksonwu.xyz/rules/signed-effect-input.html
Release: Nightshade 0.1.1 (v0.1.1)

| Field | Value |
| --- | --- |
| Rule ID | `signed-effect-input` |
| Severity | low |
| Confidence | varies |
| Maturity | experimental |
| Selection | Opt-in |
| Policy intent | not required |
| Default enabled | no |
| Category | Other active opt-ins / Token, coin and value transfers |
| Engine facts used | successful-signature-calls, all-predicates, original-write-history |
| Release | v0.1.1 |

## Selection and scope

Not selected by default. Select it with `--detectors` or the `detectors` list in nightshade.json. Either one replaces profile selection, so list every rule you want.

```sh
./.nightshade/node_modules/.bin/nightshade ./contracts --detectors signed-effect-input
./.nightshade/node_modules/.bin/nightshade detector show signed-effect-input
```

The first command runs only this rule; `--detectors` takes a comma-separated list. The second prints the rule's metadata from your installed version.

Severity is review priority. It does not express exploitability or impact. Confidence is detector metadata, not a probability. All built-in rules are experimental.

Compiler scope: the engine supports the pinned profiles 0.28.0, 0.29.0, 0.30.0, 0.31.1, 0.33.0-rc.2, 0.34.0, 0.35.0-rc.1 and 0.35.0, with ZKIR2 by default. Support for this rule can be narrower; the rule documentation below states any narrower scope.

## Corpus checks

Synthetic corpus checks for this rule in the 0.1.1 proof run. A check counts only with compiler acceptance and complete analysis.

| Positive detected | Corrected quiet | Lookalike quiet | Other negative quiet | Incomplete |
| ---: | ---: | ---: | ---: | ---: |
| 3/3 | 3/3 | 3/3 | 0/0 | 0 |

No deviations were recorded for this rule.

These are behavior checks on synthetic fixtures, not a precision or recall estimate. See [evaluation](https://nightshade.dicksonwu.xyz/evaluation.md#synthetic-corpus).

## Rule documentation

From https://github.com/DicksonWu654/nightshade/blob/v0.1.1/docs/detectors/signed-effect-input.md at v0.1.1.

Availability: **opt-in**; low severity, medium confidence. No policy required.

Opt-in, low severity intent review. On an original modeled successful exported
circuit history, a canonical `jubjubSchnorrVerify` Boolean result is explicitly
enforced before an ordinary scalar ledger assignment. The assigned value has a
caller parameter or witness source absent from the signed message's represented
dependencies. The exact finding is **effect input not among signed message
dependencies**. A known benign pattern is an unsigned effect input constrained by
a separate trusted guard or intentionally left outside the signed statement.
This is neither a sole authorization claim nor an exploitability claim.

The owned rule uses exact canonical signature observations, all successful
predicates, immutable write snapshots, and mandatory Boolean equality closure.
Transparent aliases and transitive Boolean equalities are supported; common source
provenance never establishes value equality. A returned `false` alone does not
abort a history or enforce an unused signature. Later aborts remove the history.
A namesake verifier and an unrelated repeated signature cannot supply enforcement
for another observed result. Aggregate dependency leaves retain their individual
source identities.

Scalar-state scope excludes constructors, nested/aggregate storage, Counter and
collection effects and network/fork/preimage binding claims.
Signatures enforced only after a write are outside this conservative initial
ordering scope. This does not require every effect input to be signed. No key trust
or message protocol interpretation is inferred. A signed message containing the
chosen effect input suppresses this source observation; a constant-only effect
supplies no independent source to report.

Integration: register `signedEffectInput` from
`src/detectors/signed-effect-input.ts` with `defaultEnabled: false`. Select canonical
signature observation (`signatureEvidence` / `observeSignatures`), retain
`predicateScope: "all"`, and use `pathSemantics: "equivalent-states"`. Configure the
ordinary interpreter with fold partitions and hash choices disabled to retain
original histories. The rule has a one-million-unit allowance, and equality
decoding has the shared bounded allowance/depth. Missing evidence or exhausted
work produces rule-scoped incomplete diagnostics through the caller. Baseline
transfer incompleteness prevents findings for the affected entry.

Owned tests use harmless Field assignments and compiler `--skip-zk` acceptance;
no contract execution or proof generation is needed. Tests compare instruction
and expression engines with summaries enabled and disabled.

The same opt-in rule also reviews the input nonce at canonical `sendShielded`
(including the inner call of `sendImmediateShielded`). It retains the full input
argument before the send body and uses only mandatory predicates preceding that
operation boundary. A check after the send cannot donate authorization or operand
binding. Canonical Schnorr and ZKIR3 ECDSA verifications are recognized separately;
missing verifier/send observation markers or ordering boundaries remain incomplete.
Sibling coin fields and repeated calls retain distinct leaf identities. Exact
digest inputs and scalar equality closure allow a separately supplied input nonce
constrained to signed data to stay quiet.

The exact review is **input coin nonce absent from signed message dependencies**.
Coin nonce is not claimed to be a complete coin identity. Dependence is not a
proof of injective serialization, trusted key, signature quorum, sole authorization
or replay resistance. The owned typed ECDSA approval seed covers operation, self
address, approval nonce and amount, then demonstrates the independent input nonce
omission as a static source pattern. Its correction includes the full coin in the
digest. It is not an executable reproduction of the historical approval protocol.
Network/fork, preimage-only and issuer-descriptor findings remain separate misses.

## Suppress a match

If a match is intentional, suppress it on the line before with the exact rule ID and a reason of at least eight characters:

```compact
// nightshade-disable-next-line signed-effect-input -- Reason this match is intentional
```

Diagnostics cannot be suppressed, and an unmatched directive for a selected rule makes analysis incomplete. See [configuration](https://nightshade.dicksonwu.xyz/configuration.md#suppress-an-intentional-match) for fingerprint suppressions and baselines.

## References

- [Rule source document at v0.1.1](https://github.com/DicksonWu654/nightshade/blob/v0.1.1/docs/detectors/signed-effect-input.md)
- [Catalog entry in rules.json](https://nightshade.dicksonwu.xyz/rules.json)
- [All rules](https://nightshade.dicksonwu.xyz/rules.md#token-coin-and-value-transfers)
- [Limitations](https://nightshade.dicksonwu.xyz/limitations.md)
