Looks like I failed to explain things well enough.
There’s two separate controllers:
- The controllers in the view of the IC (I’ll call those canister controllers): What you actually think about when you hear the term ‘controller’. A canister controller can request a canister’s status, start/stop/delete the canister, install new wasm modules, and so on.
dfx canister info
returns the list of canister controllers. - The controllers in the _internal_view of the wallet (I’ll call those wallet controllers): Here is the definition of a wallet controller: [wallet code]. This is what the code running inside the wallet canister (what I called wallet wasm in my previous post) defines as its own notion of a controller. This is totally fine from a technical standpoint, but very confusing as shown by this thread. This wallet controller can NOT perform the tasks listed for the canister controller, but instead can transfer cycles, add/remove custodians, list the history of transactions in this wallet and so on.
dfx wallet controllers
returns the list of wallet controllers.
In the end, it’s just a name clash between two related, but distinct concepts, caused by an unfortunate name overlap. Does this clear up the confusion, @jzxchiang?