From the standpoint of propositional logic if a Sudoku has a unique solution then that solution (and every step leading up to it) can always be reached by a logical deduction.
Put another way, for each of the 729 cell-value candidates there always
exists a deductive proof that the candidate is or is not part of the solution, where the proof depends only on the standard exactly-one constraints that define Sudoku, the initial givens for the puzzle, and the single inference rule of propositional resolution. This is just a consequence of the soundness and completeness of resolution as an inference procedure in propositional logic.
That being said, even though there always exists a way to make deductive progress on a puzzle, this doesn't mean that the corresponding resolution proof is short or tree-structured or easy to find, which are some of the things people are really getting at when discussing logical methods for solving Sudoku.
With the exception of techniques based on uniqueness assumptions (which are never necessary in the framework above) all of the logical techniques that humans use in puzzle solving correspond to searches for restricted classes of resolution proofs. You could say roughly that the restricted classes we look for are those that are simple or easy to recognize or describe. But this isn't always true. It might be more accurate to say that we look for those that can be discovered with (small) bounded working memory (so you can keep things in your head without a pencil and eraser). But really there is no principled distinction between the restricted classes we associate with logical methods and the encompassing set of all resolution proofs that arise from propositional logic.
So to your question: Can you add more deductions to your code? Certainly yes. Have you added all deductions that human solvers would count as not involving guessing? This is not a well defined goal.