Well, not quite. As I understand it, this is how things work:
Some things are in scope. These include things that can be seen according the normal visibility rules (in the same room, not in opaque containers, and so on–it’s pretty complicated), as well as things that we have placed in scope with an “After deciding the scope of the player” rule. These are also the things that count as visible. (So in this way the word “visible” in “visible thing” does mean the same thing as "if the basilisk is “visible”–they’ll both work whenever the thing in question is in scope.)
Ordinarily, the parser will only bother to check things that are in scope, and anything else will yield a “you can’t see any such thing” error. That’s because an Understand line that contains a “[something]” token only works on things that are in scope. But if you define an Understand line with “[any thing]”, the parser won’t bother with the scope check and will run through every thing in the model world, in scope or not.
This all happens when the command is being parsed into an action. Once it’s parsed into an action, if the action is defined as applying to “one thing,” it goes through reachability checks to see whether you can touch the object. If it’s defined as applying to “one visible thing,” it doesn’t bother with the reachability checks–as long as the command is parsed into an action, the action can proceed.
Maybe think of it this way:
“a thing”=a thing that is reachable. (What zarf defined as “reachable-only,” meaning “only reachable things can be used.” This isn’t a technical Inform term.) These will almost always also be visible.
“a visible thing”= a thing that is in scope, whether or not it’s reachable. (What zarf defined as “reachable-or-not.”)
Which basically gives three layers of accessibility:
“[any thing]” token + action defined on “a visible thing” = the parser doesn’t bother to check scope and the action rules don’t bother to check reachability, so the action really works on anything.
“[something]” token + action defined on “a visible thing” = the parser only goes over things in scope, but then the action rules don’t check reachability. So the action will work on things in transparent closed containers and things that have been added to scope, but not on things that are just far away.
“[something]” token + action defined on “a thing” = the parser only goes on things in scope, and then the action rules check reachability. So if you have something in a transparent container, or something that’s been placed in scope but in another room, the acciton will fail with a message about how you can’t reach into the container/other room (unless you make reaching inside/outside rules that allow access).
Here’s an example of those three kinds. Scrying is defined with an “[any thing],” so it works even on the rock which isn’t in scope; examining is defined with “[something]” and applies to one visible thing, so it works on the beacon which is added to scope but not the rock which isn’t in scope; taking applies to one thing, so it fails for the beacon (although it’s understood). Note that when we scry the rock, it’s invisible, because it’s not in scope.
[code]Lab is a room. Closet is a room. A rock is in closet. A brightly glowing beacon is in closet.
Scrying is an action applying to one visible thing. Understand “scry [any thing]” as scrying.
Report scrying: say “[The noun] is [if the noun is not visible]in[end if]visible.”
After deciding the scope of the player: place the beacon in scope.[/code]
Lab
scry rock
The rock is invisible.scry beacon
The brightly glowing beacon is visible.x rock
You can’t see any such thing.x beacon
You see nothing special about the brightly glowing beacon.get rock
You can’t see any such thing.get beacon
You can’t reach into Closet.
[Edited on Sept. 9, 2017: Deleted a stray sentence and a half at the end.]